r - lmPerm P 值因系数阶数而异

标签 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)

数据可以在 GitHub 上找到:this link .

当调用标准 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 ***

谢谢!

最佳答案

我已经看到 2 票赞成将其迁移到交叉验证,但以我的愚见,这应该保留在 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

注意,用summary打印时,Pr(Prob)应为“<2e-16”,但使用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

关于r - lmPerm P 值因系数阶数而异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40537597/

相关文章:

algorithm - 通过最小化正交距离的最佳拟合平面

java - 我有一个用于生成特定长度的字符串排列的代码,它不适用于 abcdefghijklmnopqrstuvwxyz 和 7 的输入

c++ - 从数字中获取所有组合而不重复

java - java中的高效排列算法

终端 Linux 中的 R 工作区

r - R 中热图上按簇对变量进行分组

Python从两组点中获取变换矩阵

r - R 中引用类的initialize() 方法中的自动分配

r - 使用 ggplot2 在观察样本的均值/中位数周围建立置信带的更好方法

Python scikit 学习(指标): difference between r2_score and explained_variance_score?