使用R计算多元回归中每个预测变量所解释的方差


14

我进行了一次多元回归分析,该模型作为一个整体是有意义的,并解释了约13%的方差。但是,我需要找到每个重要预测变量所解释的方差量。如何使用R做到这一点?

以下是一些示例数据和代码:

D = data.frame(
    dv = c( 0.75, 1.00, 1.00, 0.75, 0.50, 0.75, 1.00, 1.00, 0.75, 0.50 ),
    iv1 = c( 0.75, 1.00, 1.00, 0.75, 0.75, 1.00, 0.50, 0.50, 0.75, 0.25 ),
    iv2 = c( 0.882, 0.867, 0.900, 0.333, 0.875, 0.500, 0.882, 0.875, 0.778, 0.867 ),
    iv3 = c( 1.000, 0.067, 1.000, 0.933, 0.875, 0.500, 0.588, 0.875, 1.000, 0.467 ),
    iv4 = c( 0.889, 1.000, 0.905, 0.938, 0.833, 0.882, 0.444, 0.588, 0.895, 0.812 ),
    iv5 = c( 18, 16, 21, 16, 18, 17, 18, 17, 19, 16 ) )
fit = lm( dv ~ iv1 + iv2 + iv3 + iv4 + iv5, data=D )
summary( fit )

这是带有我的实际数据的输出:

Call: lm(formula = posttestScore ~ pretestScore + probCategorySame + 
    probDataRelated + practiceAccuracy + practiceNumTrials, data = D)

Residuals:
    Min      1Q  Median      3Q     Max 
-0.6881 -0.1185  0.0516  0.1359  0.3690 

Coefficients:
                  Estimate Std. Error t value Pr(>|t|)
 (Intercept)        0.77364    0.10603    7.30  8.5e-13 ***
 iv1                0.29267    0.03091    9.47  < 2e-16 ***
 iv2                0.06354    0.02456    2.59   0.0099 **
 iv3                0.00553    0.02637    0.21   0.8340
 iv4               -0.02642    0.06505   -0.41   0.6847
 iv5               -0.00941    0.00501   -1.88   0.0607 .  
--- Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

Residual standard error: 0.18 on 665 degrees of freedom
 Multiple R-squared:  0.13,      Adjusted R-squared:  0.123
 F-statistic: 19.8 on 5 and 665 DF,  p-value: <2e-16

此问题已在此处得到解答,但是可接受的答案仅针对不相关的预测变量,尽管有其他响应针对相关的预测变量,但仅提供了一般提示,而不是特定的解决方案。如果我的预测变量相互关联,我想知道该怎么办。


2
您在这里看到Jeromy Anglim的答案了吗?
2013年

是的,这是我所指的额外答复。我希望有一些更具体,更逐步的内容。我确实下载了ppcor,但不确定如何处理spcor输出。另外,我想知道核心R是否有办法做到这一点?看起来这很普通,不需要特殊的程序包。
baixiwei 2013年

关于相关预测变量的问题的最短答案是,如果没有至少进一步的假设和近似,就无法量化它们各自的重要性。这样考虑:如果这很简单,为什么由于许多研究人员认为他们想要它而又不容易获得?
Nick Cox

我建议研究一下relaimpo软件包及其随附的文件:jstatsoft.org/index.php/jss/article/view/v017i01/v17i01.pdf我经常使用“ LMG”方法。
菲尔

Answers:


16

解释的百分比取决于输入的顺序。

如果您指定一个特定的顺序,则可以在R中进行简单的计算(例如,通过updateanova函数,请参见下文),但是不同的输入顺序可能会产生完全不同的答案。

[一种可能是对所有订单或某物求平均,但它会变得笨拙并且可能无法回答一个特别有用的问题。]

-

正如Stat所指出的,对于一个模型,如果您一次只关注一个变量,则可以使用“ anova”来生成平方和表的增量。这将从您的代码开始:

 anova(fit)
Analysis of Variance Table

Response: dv
          Df   Sum Sq  Mean Sq F value Pr(>F)
iv1        1 0.033989 0.033989  0.7762 0.4281
iv2        1 0.022435 0.022435  0.5123 0.5137
iv3        1 0.003048 0.003048  0.0696 0.8050
iv4        1 0.115143 0.115143  2.6294 0.1802
iv5        1 0.000220 0.000220  0.0050 0.9469
Residuals  4 0.175166 0.043791        

-

因此,我们已经解释了增量方差;我们如何获得比例?

琐碎地将它们除以1除以它们的总和。(将1替换为100,以解释百分比差异。)

在这里,我将其显示为anova表的添加列:

 af <- anova(fit)
 afss <- af$"Sum Sq"
 print(cbind(af,PctExp=afss/sum(afss)*100))
          Df       Sum Sq      Mean Sq    F value    Pr(>F)      PctExp
iv1        1 0.0339887640 0.0339887640 0.77615140 0.4280748  9.71107544
iv2        1 0.0224346357 0.0224346357 0.51230677 0.5137026  6.40989591
iv3        1 0.0030477233 0.0030477233 0.06959637 0.8049589  0.87077807
iv4        1 0.1151432643 0.1151432643 2.62935731 0.1802223 32.89807550
iv5        1 0.0002199726 0.0002199726 0.00502319 0.9468997  0.06284931
Residuals  4 0.1751656402 0.0437914100         NA        NA 50.04732577

-

如果您决定要几个特定的​​输入顺序,则可以执行以下更一般的操作(如果需要,还可以一次输入或删除变量组):

 m5 = fit
 m4 = update(m5, ~ . - iv5)
 m3 = update(m4, ~ . - iv4)
 m2 = update(m3, ~ . - iv3)
 m1 = update(m2, ~ . - iv2)
 m0 = update(m1, ~ . - iv1)

 anova(m0,m1,m2,m3,m4,m5)
Analysis of Variance Table

Model 1: dv ~ 1
Model 2: dv ~ iv1
Model 3: dv ~ iv1 + iv2
Model 4: dv ~ iv1 + iv2 + iv3
Model 5: dv ~ iv1 + iv2 + iv3 + iv4
Model 6: dv ~ iv1 + iv2 + iv3 + iv4 + iv5
  Res.Df     RSS Df Sum of Sq      F Pr(>F)
1      9 0.35000                           
2      8 0.31601  1  0.033989 0.7762 0.4281
3      7 0.29358  1  0.022435 0.5123 0.5137
4      6 0.29053  1  0.003048 0.0696 0.8050
5      5 0.17539  1  0.115143 2.6294 0.1802
6      4 0.17517  1  0.000220 0.0050 0.9469

(这种方法也可能是自动化的,例如通过循环和使用get。可以根据需要以多种顺序添加和删除变量)

...然后像以前一样缩放到百分比。

(注:我解释如何做这些事情的事实不一定被认为是我所解释的一切的提倡。)


2
R2anova(fit)m0m5

修改后的答案非常有用。我想我要去那里。一个问题:如果我按照您所描述的方式计算针对iv5(最后一个变量)解释的方差比例,那么这在数学上是否等于在有和没有iv5的情况下通过汇总应用于模型的R ^ 2值的差异?实际上,我得到的是相同的值,只是想检查一下它们在概念上是否相同。
baixiwei 2013年

还有一个问题:对于两个不同的iv中的每一个,我是否有理由不能执行我在上一条注释中刚刚描述的事情?这是否等同于您第二种建议的方法,涉及输入变量的不同顺序?
baixiwei 2013年

R2summary.lm

2

我证明了给定预测变量在多元线性回归中解释的变化百分比是斜率系数与预测变量与因变量拟合值的相关性的乘积(假设所有变量均已标准化为均值零和方差一;这不失一般性)。在这里找到:

https://www.researchgate.net/publication/306347340_A_Natural_Decomposition_of_R2_in_Multiple_Linear_Regression


3
欢迎使用user128460,但这是一个“问答”网站,而不是“问题和链接至答案”网站。
罗伯特·朗

那不是Pratt的分数吗?
布雷特

2

您可以使用hier.part库对单个因变量对N个自变量的所有组合进行回归的拟合度度量

library(hier.part)
env <- D[,2:5]
all.regs(D$dv, env, fam = "gaussian", gof = "Rsqu",
     print.vars = TRUE)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.