我有一个目标变量Y和一列可能影响Y的100个维度(假设为X1...X100)。
运行我的glm
并查看模型摘要后,我可以看到那些具有统计显著性的变量。我想能够选择这些变量并运行另一个模型来比较性能。是否有一种方法可以解析模型摘要并仅选择那些显著的变量?
我有一个目标变量Y和一列可能影响Y的100个维度(假设为X1...X100)。
运行我的glm
并查看模型摘要后,我可以看到那些具有统计显著性的变量。我想能够选择这些变量并运行另一个模型来比较性能。是否有一种方法可以解析模型摘要并仅选择那些显著的变量?
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,暗示着完美的关系。#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
对于在使用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= "+")))
这将修复你在仅选择第一个变量时遇到的错误。
在sig.formula中,通过paste函数将"y ~"和relevant.x拼接起来作为一个formula对象赋值给sig.formula。
当你只拼接relevant.x的第一个变量时,其他变量会被忽略(例如尝试将条件反转为>0.5)。