在回答存在多重共线性时模型选择的问题时,Frank Harrell 建议:
将所有变量放入模型中,但不测试针对竞争变量的影响调整的一个变量的影响......竞争变量的块测试很强大,因为共线变量在整体多自由度关联测试中联合起来,而不是相互竞争,就像您单独测试变量时一样。
什么是块测试?你能举例说明他们在 R 中的应用吗?
在回答存在多重共线性时模型选择的问题时,Frank Harrell 建议:
将所有变量放入模型中,但不测试针对竞争变量的影响调整的一个变量的影响......竞争变量的块测试很强大,因为共线变量在整体多自由度关联测试中联合起来,而不是相互竞争,就像您单独测试变量时一样。
什么是块测试?你能举例说明他们在 R 中的应用吗?
@mark999 提供了一个很好的答案。除了联合测试多项式项之外,您还可以联合测试(“块测试”)任何一组变量。假设您有一个模型,其中包含相互竞争的共线变量三头肌周长、腰围、臀围以及所有身体尺寸的测量值。要获得整体身体大小块测试,您可以这样做
require(rms)
f <- ols(y ~ age + tricep + waist + pol(hip, 2))
anova(f, tricep, waist, hip) # 4 d.f. test
您可以通过拟合仅包含年龄的模型(如果没有NA
s in tricep, waist, hip
)并进行“差异测试”。这些等效测试在三个变量之间甚至不会受到极端共线性的影响。
宏的评论是正确的,安迪的评论也是正确的。这是一个例子。
> library(rms)
>
> set.seed(1)
> d <- data.frame(x1 = rnorm(50), x2 = rnorm(50))
> d <- within(d, y <- 1 + 2*x1 + 0.3*x2 + 0.2*x2^2 + rnorm(50))
>
> ols1 <- ols(y ~ x1 + pol(x2, 2), data=d) # pol(x2, 2) means include x2 and x2^2 terms
> ols1
Linear Regression Model
ols(formula = y ~ x1 + pol(x2, 2), data = d)
Model Likelihood Discrimination
Ratio Test Indexes
Obs 50 LR chi2 79.86 R2 0.798
sigma 0.9278 d.f. 3 R2 adj 0.784
d.f. 46 Pr(> chi2) 0.0000 g 1.962
Residuals
Min 1Q Median 3Q Max
-1.7463 -0.4789 -0.1221 0.4465 2.2054
Coef S.E. t Pr(>|t|)
Intercept 0.8238 0.1654 4.98 <0.0001
x1 2.0214 0.1633 12.38 <0.0001
x2 0.2915 0.1500 1.94 0.0581
x2^2 0.2242 0.1163 1.93 0.0602
> anova(ols1)
Analysis of Variance Response: y
Factor d.f. Partial SS MS F P
x1 1 131.894215 131.8942148 153.20 <.0001
x2 2 10.900163 5.4500816 6.33 0.0037
Nonlinear 1 3.196552 3.1965524 3.71 0.0602
REGRESSION 3 156.011447 52.0038157 60.41 <.0001
ERROR 46 39.601647 0.8609054
“块检验”不是单独考虑x2
和x2^2
项,而是 2-df 检验,它检验这些项的系数都为零的零假设(我相信它通常被称为“一般线性 F 检验” )。该检验的 p 值为 0.0037,由 给出anova(ols1)
。
请注意,在rms
包中,您必须指定x2
术语,pol(x2, 2)
以便anova.rms()
知道它们将一起测试。
anova.rms()
将对预测变量进行类似的测试,这些变量使用例如 和 表示为受限三次样条曲线,rcs(x2, 3)
并对分类预测变量进行类似的测试。它还将在“块”中包含交互术语。
如果您想对一般的“竞争”预测变量进行块测试,如引用中所述,我相信您必须通过分别拟合两个模型然后使用anova(model1, model2)
. [编辑:这是不正确的 - 请参阅 Frank Harrell 的回答。]