我正在尝试从regsubsets中获取重要变量(列名)。我想一个一个地获取这些重要变量,以便进行分析。以下是程序代码:
library(leaps)library(ISLR)data(Hitters)reg_fit=regsubsets(Salary~., data = Hitters, nvmax = 10, method = "forward")
问题是reg_fit中的列名与数据集Hitters中的列名不一致。
这是原始数据的输出:
names(Hitters)## [1] "AtBat" "Hits" "HmRun" "Runs" "RBI" ## [6] "Walks" "Years" "CAtBat" "CHits" "CHmRun" ## [11] "CRuns" "CRBI" "CWalks" "League" "Division" ## [16] "PutOuts" "Assists" "Errors" "Salary" "NewLeague"
这是从reg_fit中提取的输出:
colnames(summary(reg_fit)$which)## [1] "(Intercept)" "AtBat" "Hits" "HmRun" "Runs" ## [6] "RBI" "Walks" "Years" "CAtBat" "CHits" ## [11] "CHmRun" "CRuns" "CRBI" "CWalks" "LeagueN" ## [16] "DivisionW" "PutOuts" "Assists" "Errors" "NewLeagueN"
请注意,League变为了LeagueN,Division变为了DivisionW。有什么想法吗?这是不是一个bug,或者有没有简单的方法从reg_fit中获取列名?
回答:
这不是一个bug。这是将分类变量分解成指示变量,以便在回归中使用,而名称的变化是它让你知道哪个级别被分配给指示变量的正级别的方式。
如果你想避免这种情况,可以通过预处理来实现。以下是针对变量League
的一个示例:
League <- rep(0,322)League[Hitters$League == "N"] <- 1Hitters$League <- as.numeric(as.character(League))reg_fit=regsubsets(Salary~., data = Hitters, nvmax = 10, method = "forward")colnames(summary(reg_fit)$which)
在上面的示例中,我创建了一个数值变量,当League
等于N
时该变量等于1,并用它替换了League
的factor
变量版本。
对于二元因子变量,你可以在运行回归后更改结果对象中的标签,但如果有超过两个级别,这种方法就不适用了。对于多类因子变量,你需要在原始数据集中创建多个指示变量,就像我在上面的示例中所做的那样。