在R的glm模型中选择具有统计学意义的变量

17

我有一个目标变量Y和一列可能影响Y的100个维度(假设为X1...X100)。

运行我的glm并查看模型摘要后,我可以看到那些具有统计显著性的变量。我想能够选择这些变量并运行另一个模型来比较性能。是否有一种方法可以解析模型摘要并仅选择那些显著的变量?


1
尝试使用glmulti包。 - krlmlr
4
此外,你必须警惕用这种方式选择“重要”的变量。仅通过添加/删除一个自变量,统计显著性就可能发生改变。你的问题表明第一次运行中所有不显著的变量都将被删除。这样做可能会导致最初显著的变量变得不显著,而你删除的某些变量可能具有良好的预测价值。你真正需要的是逐个删除变量,并逐步比较模型拟合优度。请参见此主题讨论:http://bit.ly/ZLVaD5 - Maxim.K
请参阅此链接:http://www.statmethods.net/stats/regression.html - Maxim.K
3
在CrossValidated上,逐步回归并不受欢迎。就像我在聊天中所说的那样,我可能会用套索方法来处理这个问题。无论如何,这与此处的主题无关。 - Roland
4个回答

29
尽管 @kith 已经为我们铺平了道路,但仍有更多可以做的。实际上,整个过程都可以自动化。首先,让我们创建一些数据:
x1 <- rnorm(10)
x2 <- rnorm(10)
x3 <- rnorm(10)
y <- rnorm(10)
x4 <- y + 5 # this will make a nice significant variable to test our code
(mydata <- as.data.frame(cbind(x1,x2,x3,x4,y)))

我们的模型如下:

model <- glm(formula=y~x1+x2+x3+x4,data=mydata)

布尔向量的系数确实可以通过以下方式提取:

toselect.x <- summary(model)$coeff[-1,4] < 0.05 # credit to kith

不仅如此!此外,我们还可以做到这一点:

# select sig. variables
relevant.x <- names(toselect.x)[toselect.x == TRUE] 
# formula with only sig variables
sig.formula <- as.formula(paste("y ~",relevant.x))  

编辑:正如后续帖子所指出的那样,后一行应为sig.formula < - as.formula(paste("y ~",paste(relevant.x, collapse= "+")))以包括所有变量。

按照OP最初所需的方式,仅使用显著变量运行回归:

sig.model <- glm(formula=sig.formula,data=mydata)
在这种情况下,估计值将等于1,因为我们已将x4定义为y + 5,暗示着完美的关系。

1
太好了,谢谢!但是我不得不稍微改变sig.formula才能让它对我起作用:sig.formula <- as.formula(paste(" y ~", paste(relevant.x, collapse=" + ")))。如果没有collapse,它只会从relevant.x中获取第一个变量名。 - ElinaJ
1
确实,其他帖子中也提到了这一点。为了更清晰地回答问题,我已经将改进措施包含在答案中。 - Maxim.K
当我这样做时,对于被转换为因子的变量它不起作用。有没有什么解决办法? - Alberto MQ

7
您可以通过函数“summary”获取glm结果的p值。系数矩阵的最后一列称为“Pr(>|t|)”,保存了模型中使用的因素的p值。
以下是一个示例:
#x is a 10 x 3 matrix
x = matrix(rnorm(3*10), ncol=3)
y = rnorm(10)
res = glm(y~x)
#ignore the intercept pval
summary(res)$coeff[-1,4] < 0.05

2

对于在使用Maxim.K命令时遇到问题的人

sig.formula <- as.formula(paste("y ~",relevant.x))

使用此功能

sig.formula <- as.formula(paste("y ~",paste(relevant.x, collapse= "+")))

最终的代码将如下所示。
toselect.x <- summary(glmText)$coeff[-1,4] < 0.05 # credit to kith
# select sig. variables
relevant.x <- names(toselect.x)[toselect.x == TRUE] 
# formula with only sig variables
sig.formula <- as.formula(paste("y ~",paste(relevant.x, collapse= "+")))  

这将修复你在仅选择第一个变量时遇到的错误。


1

在sig.formula中,通过paste函数将"y ~"和relevant.x拼接起来作为一个formula对象赋值给sig.formula。

当你只拼接relevant.x的第一个变量时,其他变量会被忽略(例如尝试将条件反转为>0.5)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接