15

我有一个结果变量,比如 Y 和一个可能影响 Y 的 100 个维度的列表(比如 X1...X100)。

在运行我glm的模型并查看模型摘要后,我看到了那些具有统计意义的变量。我希望能够选择这些变量并运行另一个模型并比较性能。有没有办法可以解析模型摘要并仅选择重要的?

4

4 回答 4

26

尽管@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,这意味着完美的关系。

于 2013-04-22T18:58:50.373 回答
6

您可以通过函数“summary”访问 glm 结果的 pvalue。系数矩阵的最后一列称为“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
于 2013-04-22T18:24:01.747 回答
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= "+")))  

这修复了您在单独选择第一个变量时面临的错误。

于 2015-05-23T14:19:05.857 回答
1

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

您仅粘贴相关.x 的第一个变量,其他变量将被忽略(例如,尝试将条件反转为 >0.5)

于 2013-05-03T17:46:50.180 回答