2017-08-09 24 views
3

我有一個用於實驗的CRM數據集,其中虛擬W對應於治療/對照組(請參閱下面的代碼)。當我測試的來自其它特徵W上的獨立性,我意識到兩兩件事:因相似性和pvalues而未定義的Coef

  • 當使用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

你的問題是+ 0model.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 

最終,這歸結爲你的治療對比的理解。通常,您不應該從模型矩陣中排除截距。

+0

謝謝羅蘭。我正在閱讀這篇文章https://www.r-bloggers.com/be-careful-with-using-model-design-in-r/其中作者指出,做lm(0 + ...)結果一個不同的R^2和F統計量。我的閱讀是應該避免。我誤解了這一點嗎? – Stefano

+0

@Stefano不,你沒有誤解。如果這是一個問題,你可以使用'f1 = lm(DT $ W〜m [, - 1])''。你*應該*做的就是簡單地使用'f2'。如果你想去手動路線,最好做到這一點,即使用'lm.fit(m,DT [[「W」]])'並自己計算統計量。 – Roland

+0

謝謝!全清!我會看看我不知道的lm.fit,並花些時間閱讀治療對比。 – Stefano