2017-02-20 89 views
0

我想通過循環遍歷包含響應變量(dat_prob)的數據集中的列來運行glmer。我使用的代碼如下,從另一個stackoverflow問題(Looping through columns in R)研究的代碼改編而來。循環通過列glmer

其代碼:

dat_y<-(dat[,c(2:1130)]) 
dat_x<-(dat[,c(1)]) 
models <- list() 
# 
for(i in names(dat_y)){ 
     y <- dat_y[i] 
    model[[i]] = lm(y~dat_x) 
    } 

我的代碼:

dat_prob<-(probs[,c(108:188)]) 
dat_age<-(probs[,c(12)]) 
dat_dist<-(probs[,c(20)]) 
fyearcap=(probs[,c(25)]) 
fstation=(probs[,c(22)]) 
fnetnum=(probs[,c(23)]) 
fdepth=(probs[,c(24)]) 

models <- list() 
# 
for(i in names(dat_prob)){ 
    y <- dat_prob[i] 
    y2=as.vector(y) 
    model[[i]] = glmer(y ~ dat_age * dat_dist + (1|fyearcap) + (1|fstation)+ 
    (1|fnetnum)+ (1|fdepth),family=binomial,REML=TRUE) 
} 

我收到此錯誤,類似錯誤的超鏈接的問題的答覆:

Error in model.frame.default(drop.unused.levels = TRUE, formula = y ~ : 
invalid type (list) for variable 'y' 

我一直通過這個工作數小時,現在無法通過樹木看到森林。

任何幫助表示讚賞。

+0

你要放一切都在一個更好的data.frame並迭代它。或者,你可以預先構造公式(不需要對數據進行子集化)並將其傳遞給'glmer'函數。您可以使用'sapply'或'lapply'瀏覽公式列表。 –

回答

0

y <- dat_prob[i]使得y列表(或數據框,無論)。列表是向量 - 嘗試is.vector(list()),因此即使y2 = as.vector(y)仍然是列表/數據幀(即使您不使用它)。

class(as.vector(mtcars[1])) 
# [1] "data.frame" 

要從數據幀中提取一個數字矢量,使用[[y <- dat_prob[[i]]

class(mtcars[[1]]) 
# [1] "numeric" 

雖然我同意羅馬 - 使用公式可能是一個更好的方式去。嘗試是這樣的:

for(i in names(dat_prob)) { 
    my_formula = as.formula(paste(i, 
    "~ dat_age * dat_dist + (1|fyearcap) + (1|fstation)+ (1|fnetnum)+ (1|fdepth)" 
)) 
    model[[i]] = glmer(my_formula, family = binomial, REML = TRUE) 
} 

我也很懷疑無論你做什麼嘗試80個不同的反應變量的,但是這不是你的問題......