2017-03-09 115 views
0

我試圖在R中創建一個包裝函數,它將一系列參數(響應,預測器,最大隨機效果,參數)提供給混合效果線性迴歸型號使用lmer()。我遇到的問題是如何使包裝函數足夠靈活以適應不同數量的參數。我沒有看到我沒有在每次(x1,x2,x3等)都沒有對函數進行硬編碼的情況下做到這一點。當我們考慮包括隨機效應和隨機斜率在內的最大隨機效應並截取(slope|intercept)時,這是特別複雜的。我會很感激你的任何建議。用於擬合混合效果模型與lmer()的包裝

#re.list should be a list of tuples (slope|intercept) 
lmer.wrap(df, resp, feature.list, re.list, reml){  
    lmer(resp ~ 
      feature.set[1] 
      + feature.set[2] 
      + feature.set[3] 
      + (re.list[1[1]]|re.list[1[2]]) 
      + (re.list[2[1]]|re.list[2[2]]), 
      REML = reml, 
      data = df) 
} 
+0

請參閱'?reconulate' ...' –

回答

1

一般來說,我認爲這不是一個好主意 - 自動模型建立和最大模型通常會導致比他們的價值更大的麻煩。假設您知道自己在做什麼並且有足夠的理由這樣做,那麼接下來要知道的是,迄今爲止構建具有任意預測變量的模型擬合公式的最簡單方法是通過預測變量變量作爲字符向量並將它們粘貼在一起。 reformulate()是一個方便的捷徑,但它與as.formula(paste(terms,collapse="+"))實際上沒有太大的區別。

library(lme4) 

lmer.wrap <- function(df, resp, feature.list, re.list, reml=FALSE) { 
     ## set up random effects 
     randstr <- sapply(re.list, 
       function(x) sprintf("(%s|%s)",x[1],x[2])) 
     form <- reformulate(c(feature.list,randstr), 
         response=resp) 
     return(lmer(form,REML = reml,data = df)) 
} 

讓我們嘗試一下:

lmer.wrap(sleepstudy,resp="Reaction", 
      feature.list="Days", 
      re.list=list(c("Days","Subject"))) 
## Linear mixed model fit by maximum likelihood ['lmerMod'] 
## Formula: Reaction ~ Days + (Days | Subject) 
## etc. 

如果你想傳遞的條款爲R表達式(即resp=Reactionfeature.list=Days),事情就變得相當困難(之前我去嘗試努力編碼它我會問你是否想要這樣做的美學原因或是否有一些更強大的要求)。

+0

雖然公式很容易。這是當你想通過'權重'和'抵消',它變得荒謬。 –

+0

'抵消'可以在公式中... –

+0

謝謝,這是非常有益的! –

相關問題