2014-03-26 37 views
2

R中是否存在一種方法來針對具有不同組合的數據幀中的每個不同變量運行GLM,例如,廣義線性模型的變量的不同可能組合

如果我有4個解釋變量,我可以作爲Ÿ

m1 = glm(Y ~ V1, data = d) 
m2 = glm(Y ~ V1 + V2, data = d) 
m3 = glm(Y ~ V1 + V2 + V3, data = d) 
m4 = glm(Y ~ V1 + V2 + V3 + V4, data = d) 

但是模式,我也可以有

m5 = glm(Y ~ V1 + V2 + V4, data = d) 

等。

R中是否有方法來選擇數據框內所有可能的變量組合,以查看哪些變量充當最佳預測變量?

回答

10

這就是所謂的疏浚:

library(MuMIn) 
data(Cement) 
fm1 <- lm(y ~ ., data = Cement) 
dd <- dredge(fm1) 

Global model call: lm(formula = y ~ ., data = Cement) 
--- 
Model selection table 
    (Intrc) X1  X2  X3  X4 df logLik AICc delta weight 
4 52.58 1.468 0.6623     4 -28.156 69.3 0.00 0.566 
12 71.65 1.452 0.4161   -0.2365 5 -26.933 72.4 3.13 0.119 
8 48.19 1.696 0.6569 0.2500   5 -26.952 72.5 3.16 0.116 
10 103.10 1.440     -0.6140 4 -29.817 72.6 3.32 0.107 
14 111.70 1.052   -0.4100 -0.6428 5 -27.310 73.2 3.88 0.081 
15 203.60  -0.9234 -1.4480 -1.5570 5 -29.734 78.0 8.73 0.007 
16 62.41 1.551 0.5102 0.1019 -0.1441 6 -26.918 79.8 10.52 0.003 
13 131.30    -1.2000 -0.7246 4 -35.372 83.7 14.43 0.000 
7 72.07  0.7313 -1.0080   4 -40.965 94.9 25.62 0.000 
9 117.60      -0.7382 3 -45.872 100.4 31.10 0.000 
3 57.42  0.7891     3 -46.035 100.7 31.42 0.000 
11 94.16  0.3109   -0.4569 4 -45.761 104.5 35.21 0.000 
2 81.48 1.869       3 -48.206 105.1 35.77 0.000 
6 72.35 2.312   0.4945   4 -48.005 109.0 39.70 0.000 
5 110.20    -1.2560   3 -50.980 110.6 41.31 0.000 
1 95.42        2 -53.168 111.5 42.22 0.000 
+0

因此,這裏顯示的第一個模型包含預測變量的'最佳'可能組合。那麼有沒有一種方法可以說明那些預測因子中哪一個在該模型中是最「有影響力」的,即X4的X1 X2 X3是否解釋了數據中的大部分變化?或者這是一個不同的問題呢? – KatyB

+0

是的,這是一個不同的問題,不容易回答,因爲參數不是獨立的。 – Roland

+0

好的,所以X1 ...等下的那些值(即1.468 ...不代表該變量的貢獻)? – KatyB

4

如果你只希望使用基礎R和沒有包,允許你做疏通,你可以使用combn功能,使所有可能的GLMS對象的列表:

d <- data.frame(replicate(5, rnorm(10))) 
names(d) <- c('Y', paste0('V', 1:4)) 
dep_var <- 'Y' 
indep_vars <- setdiff(names(d), dep_var) 

glms <- Reduce(append, lapply(seq_along(indep_vars), 
    function(num_vars) { 
    Reduce(append, apply(combn(length(indep_vars), num_vars), 2, function(vars) { 
     formula_string <- paste(c(dep_var, paste(indep_vars[vars], collapse = "+")), collapse = '~') 
     structure(list(glm(as.formula(formula_string), data = d)), .Names = formula_string) 
    })) 
    } 
)) 

print(names(glms)) 
# [1] "Y~V1"   "Y~V2"   "Y~V3"   "Y~V4"   "Y~V1+V2"  "Y~V1+V3"  "Y~V1+V4"  "Y~V2+V3"  "Y~V2+V4"  "Y~V3+V4"  "Y~V1+V2+V3" "Y~V1+V2+V4" 
# [13] "Y~V1+V3+V4" "Y~V2+V3+V4" "Y~V1+V2+V3+V4" 

print(glms[["Y~V2+V3+V4"]]) 

# Call: glm(formula = as.formula(formula_string), data = d) 
# 
# Coefficients: 
# (Intercept)   V2   V3   V4 
#  0.12721  0.04748  0.11369  -0.04258 

# Degrees of Freedom: 9 Total (i.e. Null); 6 Residual 
# Null Deviance:  8.932 
# Residual Deviance: 8.695 AIC: 36.98 
+0

使用'expand.grid'生成所有組合可能更簡單:'all.var.comb < - expand.grid(lapply(seq_along(indep_vars),c,0))' –

+0

@Robert Krzyzanowski很棒的答案!你知道如何從交叉驗證結果模型中獲得結果嗎?現在我想選擇「最好」的模式,但是一個接一個地做會很慢。謝謝。 –

相關問題