由于相似性和p值,未定义Coef

时间:2017-08-09 08:09:15

标签: r lm

我有一个用于实验的CRM数据集,其中虚拟W对应于治疗/对照组(参见下面的代码)。当我测试W与其他功能的独立性时,我意识到了两件事:

  • 使用model.matrix时,由于相似性,未定义某些系数(此虚拟数据集中的1)。将DT直接送入lm()
  • 时没有发生这种情况
  • 在两种情况下获得的模型产生不同的结果,即,各个特征的p值改变

我(认为我)理解多共线性的概念,但在这个特殊情况下我不太明白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)

1 个答案:

答案 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

最后,归结为您对治疗对比的理解。通常,您不应该从模型矩阵中排除截距。