2017-02-20 20 views
0

Я пытаюсь запустить мерцание, перебирая столбцы в моем наборе данных, которые содержат переменные отклика (dat_prob). Код, который я использую, является следующим, адаптированным из кода, изученного другим вопросом stackoverflow (Looping through columns in R).loop through column 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 различных переменных отклика, но это не ваш вопрос ...