R 中的 step() 如何处理交互和分类变量?
How does step() in R handle interactions and categorical variables?
我在 R
.
中拟合了具有多重交互的线性回归 lm
现在,我想做变量选择。为此,我打算使用 step
-函数。
但是,我不确定 step
究竟是如何处理交互的。我希望选择过程在以下意义上是分层的:
- 如果互动 u:v 得以保留,那么 u 和 v 本身也会保留
- 对于虚拟变量 x1 和 x2,如果 x1 保持不变,则 x2 保持不变,反之亦然
我怎样才能确保这一点?已经这样实现了吗?
您可以使用 regsubsets
获取所有可能的逐步回归模型,并从中提取满足您要求的子集。例如,当只考虑双向交互时,可以使用下面的方式来满足第一个需求:
require(leaps)
require(stringr)
tmp <- regsubsets(mpg ~ (wt + drat + disp + qsec)*(wt + drat + disp + qsec), data=mtcars, nbest=1000, really.big=T, intercept=T)
df <- summary(tmp)[[1]]
df <- as.data.frame(sapply(as.data.frame(df), as.numeric))
#for all columns in df which have ':' in the name, that is an interaction column
#if such a column is 1, each of the component columns must also be 1
comb_cols <- grep(":", names(df), value = TRUE)
for (i in 1:length(comb_cols)) {
this_comb <- comb_cols[i]
left_comp <- str_sub(this_comb, start = 1, end = str_locate(this_comb, ":")[1]-1)
right_comp <- str_sub(this_comb, start = str_locate(this_comb, ":")[1]+1, end = nchar(this_comb))
df[,left_comp] <- ifelse(df[,this_comb]==1, 1, df[,left_comp])
df[,right_comp] <- ifelse(df[,this_comb]==1, 1, df[,right_comp])
}
df <- df[!duplicated(df),]
然后从summary(tmp)
中只提取df中的模型。
我在 R
.
lm
现在,我想做变量选择。为此,我打算使用 step
-函数。
但是,我不确定 step
究竟是如何处理交互的。我希望选择过程在以下意义上是分层的:
- 如果互动 u:v 得以保留,那么 u 和 v 本身也会保留
- 对于虚拟变量 x1 和 x2,如果 x1 保持不变,则 x2 保持不变,反之亦然
我怎样才能确保这一点?已经这样实现了吗?
您可以使用 regsubsets
获取所有可能的逐步回归模型,并从中提取满足您要求的子集。例如,当只考虑双向交互时,可以使用下面的方式来满足第一个需求:
require(leaps)
require(stringr)
tmp <- regsubsets(mpg ~ (wt + drat + disp + qsec)*(wt + drat + disp + qsec), data=mtcars, nbest=1000, really.big=T, intercept=T)
df <- summary(tmp)[[1]]
df <- as.data.frame(sapply(as.data.frame(df), as.numeric))
#for all columns in df which have ':' in the name, that is an interaction column
#if such a column is 1, each of the component columns must also be 1
comb_cols <- grep(":", names(df), value = TRUE)
for (i in 1:length(comb_cols)) {
this_comb <- comb_cols[i]
left_comp <- str_sub(this_comb, start = 1, end = str_locate(this_comb, ":")[1]-1)
right_comp <- str_sub(this_comb, start = str_locate(this_comb, ":")[1]+1, end = nchar(this_comb))
df[,left_comp] <- ifelse(df[,this_comb]==1, 1, df[,left_comp])
df[,right_comp] <- ifelse(df[,this_comb]==1, 1, df[,right_comp])
}
df <- df[!duplicated(df),]
然后从summary(tmp)
中只提取df中的模型。