4

当我在 R 中执行回归并使用类型因子时,它可以帮助我避免在数据中设置分类变量。但是如何从回归中删除不显着的因素以仅显示显着变量?

例如:

dependent <- c(1:10)
independent1 <- as.factor(c('d','a','a','a','a','a','a','b','b','c'))
independent2 <- c(-0.71,0.30,1.32,0.30,2.78,0.85,-0.25,-1.08,-0.94,1.33)
output <- lm(dependent ~ independent1+independent2)
summary(output)

这导致以下回归模型:

Coefficients:
          Estimate Std. Error t value Pr(>|t|)   
(Intercept)     4.6180     1.0398   4.441  0.00676 **
independent1b   3.7471     2.1477   1.745  0.14148   
independent1c   5.5597     2.0736   2.681  0.04376 * 
independent1d  -3.7129     2.3984  -1.548  0.18230   
independent2   -0.1336     0.7880  -0.170  0.87203   

如果我想拉出无关紧要的独立1级别(b,d),有没有办法可以做到这一点?

在这种情况下,将数据设置为具有分类变量很容易,但是当我包含周数或其他具有很多级别的因素时,它变得不方便。

这是使用分类变量构建模型的方法。正如你所看到的,构建数据最终变得更加痛苦,但也给了我更多的控制权。

regressionData <- data.frame(cbind(1:10,c(-0.71,0.30,1.32,0.30,2.78,0.85,-0.25,-1.08,-0.94,1.33),c(0,1,1,1,1,1,1,0,0,0),c(0,0,0,0,0,0,0,1,1,0),c(0,0,0,0,0,0,0,0,0,1),c(1,0,0,0,0,0,0,0,0,0)))

names(output) = c('dependent','independent2','independenta', 'independentb','independentc','independentd')

attach(regressionData)

result <- lm(dependent~independent2+independentb+independentc+independentd)
summary(result)

现在我可以删除 Independent2 因为它无关紧要

result <- lm(dependent~independentb+independentc+independentd)
summary(result)

我会删除独立的,因为它并不重要

result <- lm(dependent~independentb+independentc)
summary(result)

但在这种情况下,调整后的 R 平方下降(我什至不打算进行部分 F 检验),因为它很重要,但在许多情况下这不是真的,我需要从回归中删除分类,因为它是吃掉在这种情况下很重要的自由度,并可能掩盖其他重要变量的值。

4

3 回答 3

3

您可以使用以下选项删除因子变量的水平exclude

lm(dependent ~ factor(independent1, exclude=c('b','d')) + independent2)

这样,因素 b、d 将不会包含在回归中。

干杯

于 2014-04-15T12:56:11.143 回答
1

如果您愿意只使用系数表而不是整个摘要,则可以这样做:

提取整个系数表:

ss <- coef(summary(output))

只取你想要的行:

ss_sig <- ss[ss[,"Pr(>|t|)"]<0.05,]

printCoefmat漂亮地打印带有重要星等的系数表。

> printCoefmat(ss_sig)
              Estimate Std. Error t value Pr(>|t|)   
(Intercept)     4.6180     1.0398  4.4414 0.006756 **
independent1c   5.5597     2.0736  2.6811 0.043760 * 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

(这个答案类似于@Jilber 的答案,只是它会自动为您找到不重要的行,而不是要求您手动指定它们。)

但是,我必须同意@Charlie 上面的评论,即这是不好的统计做法......将预测变量人为地分为显着/非显着(p=0.049 和 p=0.051 的预测将被区别对待),尤其是对分类预测变量,其中重要的特定参数集将取决于对比/哪个水平用作基线...

于 2012-09-08T01:19:25.610 回答
1

如果您只想从输出中删除不重要的级别,但将它们包含在估计中,您可以使用包中的coeftest函数AER,然后使用正确的 indexig,您将得到您想要的。

 library(AER)
 coeftest(output)[-c(2,4), ]
                Estimate Std. Error    t value    Pr(>|t|)
(Intercept)    4.6180039  1.0397726  4.4413595 0.006756325
independent1c  5.5596699  2.0736190  2.6811434 0.043760158
independent2  -0.1335893  0.7880382 -0.1695214 0.872031752

如果您不想使用AER包,您还可以执行以下操作:

summary(output)$coefficients[-c(2,4),]
                Estimate Std. Error    t value    Pr(>|t|)
(Intercept)    4.6180039  1.0397726  4.4413595 0.006756325
independent1c  5.5596699  2.0736190  2.6811434 0.043760158
independent2  -0.1335893  0.7880382 -0.1695214 0.872031752

我更喜欢最后一个,因为您不需要安装额外的软件包。

我不知道这是否是你要找的。

于 2012-09-07T23:07:24.717 回答