2013-11-06 5 views
2

Я пытаюсь автоматизировать способ определения и удаления фиксированных эффектов из выражения смешанной модели с использованием lmer. Вкратце, мой подход заключается в использовании fixef для получения имен фиксированных эффектов, затем используйте update, чтобы удалить те из оператора модели. Я столкнулся несколько коряг ...удалить все фиксированные эффекты из смешанной модели

Во-первых, если фиксированные факторы не являются непрерывными, то fixef возвращает имена переменных добавляемые с уровнями лечения (например, levels(variable1)=c("A","B","C") вернется variable1B и variable1C). Я попытался обойти это с частичным сопоставлением, но я уверен, что он не будет успешным во всех случаях (см. Ниже).

Во-вторых, если есть взаимодействия, частичное совпадение разваливается и идентифицирует только первое слагаемое (например, только variable1 возвращается с variable1:variable). Я не уверен, как обойти это.

Вот несколько примеров кода:

#Create example data 
set.seed(9) 
data=data.frame(y=rnorm(100,5,10),y.binom=rbinom(100,1,0.5), 
       y.poisson=rpois(100,5),fixed1=rnorm(100,20,100), 
       fixed2=c("Treatment1","Treatment2"),covar=rnorm(100,20,100), 
       rand1=LETTERS[1:2], 
       rand2=c(rep("W",25),rep("X",25),rep("Y",25),rep("Z",25))) 

library(lme4) 

#Fit generalized linear mixed effects model 
mod=glmer(y.poisson~fixed1*fixed2+covar+(1|rand2/rand1),family="poisson",data) 
#Pull out names of fixed effects 
fixef.names=do.call(rbind,lapply(1:length(names(fixef(mod))[-1]),function(j) { 
    d=colnames([email protected])[pmatch(colnames([email protected]),names(fixef(mod))[-1][j])>0] 
    d[!is.na(d)] }))[,1] 
# Generate null model (intercept and random effects only, no fixed effects) 
null.mod=update(mod,paste(".~.-",paste(fixef.names,collapse="-"),sep="")) 

Любая помощь приветствуется!

ответ

3

Есть встроенная функция findbars() в lme4, которая доставит вас в основном. Вам все равно придется отменить результаты (они возвращаются как language объектов); защищать их круглыми скобками; и верните их обратно в формулу. Но это похоже на работу:

parens <- function(x) paste0("(",x,")") 
onlyBars <- function(form) reformulate(sapply(findbars(form), 
               function(x) parens(deparse(x))), 
               response=".") 
onlyBars(formula(mod)) 
## . ~ (1 | rand1:rand2) + (1 | rand2) 
update(mod,onlyBars(formula(mod))) 
+0

Ах-ха, очень умный, принимая противоположный подход и изолируя случайные факторы. Не знал о 'findbars'. Спасибо, Бен! – jslefche

0

1) Только для одиночных эффектов: будет ли вызывать имя «переменная», а затем сопоставлять процедуры с чем-то в фрейме данных, используемом для установки, чтобы получить правильные имена для извлечения/добавления в ваш оператор обновления?

2) Для взаимодействия, возможно, попробуйте выполнить strsplit с: во-первых. Затем проверьте длину вывода. Если> 1, сопоставьте обе переменные и при необходимости удалите/добавьте обновления. Это не будет такой изящной функцией, но она должна работать.

3) Почему бы просто не использовать библиотеку glmulti? Он уже делает это автоматическим способом. Если вам не нужны ВСЕ подходящие модели, просто извлеките те, которые вы хотите, и двигайтесь дальше. Но он будет иметь все подходящие объекты, хранящиеся в его структуре объектов.

+0

Ах, я пытаюсь автоматизировать этот процесс для любой модели, поэтому использование 'gsub' для«переменного»победил бы этот подход для любой модели, где это не имя фактора. 'glmulti' может работать, но по-прежнему кажется, что мне нужно будет выбрать нулевую модель (например, со всеми случайными эффектами, без фиксированных эффектов), поэтому я думаю, что я вернусь к квадрату. – jslefche

+0

Ну, для glmulti это просто проблема фильтрации. Вы должны уметь подмножать эти модели со случайными эффектами, которые вы хотите, а затем оттуда (что-то вроде этого в анализе biodepth). Что же касается gsub, вы можете сначала использовать grep для переменной. Если он есть, делайте факторный фактор. Если нет, то у вас есть имя переменной, поэтому не беспокойтесь. – jebyrnes