lmPerm P 值因系数顺序而异
lmPerm P-Values Different depending on Order of Coefficients
根据我在函数调用中输入变量的顺序,我从 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 个接近的投票将其迁移到 Cross Validated,但以我的拙见,它应该保留在 Stack Overflow 上。确实,在 lm
和 lmp
使用的非透视 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)
在summary
打印时应该是“<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
.
根据我在函数调用中输入变量的顺序,我从 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 个接近的投票将其迁移到 Cross Validated,但以我的拙见,它应该保留在 Stack Overflow 上。确实,在 lm
和 lmp
使用的非透视 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)
在summary
打印时应该是“<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
.