lmPerm P值根据系数顺序而不同

时间:2016-11-10 21:49:00

标签: r regression permutation linear-regression lm

根据我在函数调用中输入变量的顺序,我得到lmPerm的不同结果。

例如,在NCF.pf之前放置TotalProperties会产生以下结果:

pfit <- lmp(NetCashOps ~ NCF.pf + TotalProperties, data = sub.pm, subset = Presence == 1)

summary(pfit)
...
Coefficients:
                  Estimate   Iter  Pr(Prob)    
NCF.pf            4.581e-01    51         1    
TotalProperties   5.246e+04  5000    <2e-16 ***

但是,当我在公式中切换系数的顺序并将TotalProperties放在NCF.pf之前时,NCF.pf上的p值变得显着

pfit2 <- lmp(NetCashOps ~ TotalProperties + NCF.pf, data = sub.pm, subset = Presence == 1)

summary(pfit2)
...
Coefficients:
                  Estimate   Iter  Pr(Prob)    
TotalProperties   5.246e+04  5000   <2e-16 ***
NCF.pf            4.581e-01  5000   <2e-16 ***

我错过了什么吗?为什么p值会因为我在函数调用中切换变量的顺序而不同?

更新 - 数据来源和lm输出(11/11/2016)

可以在this link的GitHub上找到数据。

当调用标准lm函数两次(在第二次调用时反转变量的顺序)时,p值是相同的(见下文)。因此,与使用lmPerm函数时不同,变量的顺序与lm无关。

fit1 <- lm(NetCashOps ~ NCF.pf + TotalProperties, data = sub.pm, subset = Presence == 1)

summary(fit1)
...
Coefficients:
                 Estimate Std. Error t value Pr(>|t|)    
(Intercept)     7.088e+05  2.258e+05   3.138   0.0019 ** 
NCF.pf          4.581e-01  1.112e-01   4.121 5.11e-05 ***
TotalProperties 5.246e+04  9.519e+03   5.511 8.76e-08 ***


fit2 <- lm(NetCashOps ~ TotalProperties + NCF.pf, data = sub.pm, subset = Presence == 1)

summary(fit2)
...
Coefficients:
                 Estimate Std. Error t value Pr(>|t|)    
(Intercept)     7.088e+05  2.258e+05   3.138   0.0019 ** 
TotalProperties 5.246e+04  9.519e+03   5.511 8.76e-08 ***
NCF.pf          4.581e-01  1.112e-01   4.121 5.11e-05 ***

谢谢!

1 个答案:

答案 0 :(得分:2)

我已经看到了2次接近投票将其迁移到Cross Validated,但我认为这应该留在Stack Overflow上。确实,在lmlmp使用的非旋转QR分解策略下,t统计量和p值对于术语的规范顺序不是不变的,但是如新的编辑,对于OP的数据,这些统计数据应该是不变的。所以在编程层面必须有一些敏感的东西。

我的快速诊断建议,如果我们设置seqs = TRUE,而不是使用默认的FALSE,我们会得到一致的结果:

## I have subsetted data with `Presence == 1` into a new dataset `dat`
## I have also renamed variable name for simplicity

coef(summary(lmp(y ~ x1 + x2, dat, seqs = TRUE)))

#                Estimate Iter Pr(Prob)
#(Intercept) 2.019959e+06 5000        0
#x1          4.580840e-01 5000        0
#x2          5.245619e+04 5000        0

coef(summary(lmp(y ~ x2 + x1, dat, seqs = TRUE)))
#                Estimate Iter Pr(Prob)
#(Intercept) 2.019959e+06 5000        0
#x2          5.245619e+04 5000        0
#x1          4.580840e-01 5000        0

注意,Pr(Prob)应为&#34;&lt;图2e-16&#34;当由summary打印时,但在使用coef获取矩阵时,这些微小值为0。

?lmp的文档在这一部分提到了一点:

The SS will be calculated _sequentially_, just as ‘lm()’ does; or
they may be calculated _uniquely_, which means that the SS for
each source is calculated conditionally on all other sources.

我目前不确定SS是什么(因为我不是lmPerm的用户),但这听起来像是为了获得一致的结果,我们应该设置seqs = TRUE