我有一个用于实验的CRM数据集,其中虚拟W对应于治疗/对照组(参见下面的代码)。当我测试W与其他功能的独立性时,我意识到了两件事:
我(认为我)理解多共线性的概念,但在这个特殊情况下我不太明白a)为什么它出现b)为什么它对model.matrix和lm
我错过了什么?
非常感谢!
set.seed(1)
n = 302
DT = data.table(
zipcode = factor(sample(seq(1,52), n, replace=TRUE)),
gender = factor(sample(c("M","F"), n, replace=TRUE)),
age = sample(seq(1,95), n, replace=TRUE),
days_since_last_purchase = sample(seq(1,259), n, replace=TRUE),
W = sample(c(0,1), n, replace=TRUE)
)
summary(DT)
m = model.matrix(W ~ . +0, DT)
f1 = lm(DT$W ~ m)
f2= lm(W~ ., DT)
p_value_ratio <- function(lm)
{
summary_randomization = summary(lm)
p_values_randomization = summary_randomization$coefficients[, 4]
L = length(p_values_randomization)
return(sum(p_values_randomization <= 0.05)/(L-1))
}
all.equal(p_value_ratio(f1), p_value_ratio(f2))
alias(f1)
alias(f2)
答案 0 :(得分:1)
您的问题是+ 0
中的model.matrix
。第二个拟合包括模型矩阵中的截距。如果排除它,则会排除较少的因子级别(通常由截距表示):
colnames(model.matrix(W ~ ., DT))
#excludes zipcode1 and genderf since these define the intercept
colnames(model.matrix(W ~ . + 0, DT))
#excludes only genderf
请注意,f1
包含拦截,该拦截由lm
添加(我相信通过内部调用model.matrix
,但尚未检查):
m = model.matrix(W ~ . + 0, DT);
f1 = lm(DT$W ~ m );
model.matrix(f1)
你可能想要这个:
m = model.matrix(W ~ ., DT);
f1 = lm(DT$W ~ m[,-1]);
(如果您想直接使用lm.fit
,通常只手动构建模型矩阵。)
f2= lm(W~ ., DT);
all.equal(unname(coef(f1)), unname(coef(f2)))
#[1] TRUE
最后,归结为您对治疗对比的理解。通常,您不应该从模型矩阵中排除截距。