2017-03-19 80 views
1

我遇到一個錯誤,我無法找到當我嘗試任何文件,以啓動一個glmer對象:誤差bootmer和confint爲glmer

glm2 <- glmer(RT~valence+location+first_location+Trial_num + 
         (1+Trial_num|id)+(1|Trial_num), 
         family=inverse.gaussian(log), 
         control = glmerControl(optimizer = "nloptwrap", 
             calc.derivs = FALSE), data=df_long) 

的錯誤是:

錯誤lme4 :: simulateFun(對象=,: 找不到函數「SFUN

這是不管我是否嘗試bootMerconfint

bootMer_out <- bootMer(glm2,FUN=fixef, nsim=300) 

confint_out <- confint(glm2, method="boot") 

當我作爲一個lmer對象來看,我沒有與引導的問題。即

lm2 <- glmer(RT~valence+location+first_location+Trial_num + (1+Trial_num|id)+(1|Trial_num), family=inverse.gaussian(log), control = glmerControl(optimizer = "nloptwrap", calc.derivs = FALSE), data=df_long)) 

它是否與鏈接功能有關?有沒有解決方法?我在simulateFun文檔中也找不到函數'sfun'。我總是可以單獨對數據進行轉換,並使用lmer而不是glmer,但如果有人有一些很好的洞察力(因爲我現在很好奇)。

+0

'lme4 ::。simulateFun'導致'lme4 ::: simfunList',所以它看起來像你需要爲'inverse.gaussian'家族編寫'simfunList $ inverse,gaussian'方法,你可能會從'inverse.gaussian()$模擬'獲得 – user20650

+0

。我沒有看到從哪裏搶分散參數,啊,我似乎已經嘗試.. https://github.com/lme4/lme4/blob/master/R/predict.R#L776 – user20650

+0

你可能會嘗試'merTools'包生成預測值和參數分佈。它的建立部分是爲了解決這個問題 - 儘管結果與助推器所能達到的結果並不相同。 – jknowles

回答

2

正如@ user20650指出的那樣,您需要爲逆高斯族添加模擬方法。

例如,我添加了這些在我lme4叉分支predict.R下:

rinvgauss <- function(n, mu, lambda) { 
    # transcribed from https://en.wikipedia.org/wiki/Inverse_Gaussian_distribution 
    nu <- rnorm(n) 
    y <- nu^2 
    x <- mu + (mu^2 * y)/(2*lambda) - (mu/(2*lambda)) * sqrt(4*mu*lambda*y + mu^2*y^2) 
    z <- runif(n) 
    ifelse(z <= mu/(mu + x), x, mu^2/x) 
} 

inverse.gaussian_simfun <- function(object, nsim, ftd = fitted(object), 
            wts = weights(object)) { 
    if (any(wts != 1)) message("using weights as inverse variances") 
    dispersion <- sum((weights(object, 'working') * 
     resid(object, 'working')^2)[weights(object, 'working')>0])/df.residual(object) 
    rinvgauss(nsim * length(ftd), mu = ftd, 
        lambda = wts/dispersion) 
} 
# ... skip a few 
simfunList <- list(gaussian = gaussian_simfun, 
     binomial = binomial_simfun, 
     poisson = poisson_simfun, 
     Gamma = Gamma_simfun, 
     negative.binomial = negative.binomial_simfun, 
     inverse.gaussian = inverse.gaussian_simfun) 

下面是一個例子:

# devtools::install_github('aforren1/lme4', ref = 'add_invgauss_simulate') 
library(lme4) 
set.seed(1) 
dat <- data.frame(y = lme4:::rinvgauss(1000, 3, 4), 
        x = runif(1000), 
        subj = factor(rep(1:10, 100))) 

mod <- glmer(y ~ x + (1|subj), 
      data = dat, 
      family = inverse.gaussian(link='log')) 

# ~60 secs on my laptop 
(boots <- confint(mod, method = 'boot', nsim = 100, parm = 'beta_')) 
       2.5 % 97.5 % 
(Intercept) 1.0044813 1.248774 
x   -0.2158155 0.161213 

(walds <- confint(mod, method = 'Wald', parm = 'beta_')) 
       2.5 % 97.5 % 
(Intercept) 1.000688 1.2289971 
x   -0.205546 0.1644621 

您可以看到自舉方法給出(粗略地)與Wald方法相同的結果。

+0

嗨,亞歷克斯,你能指出一個參考,其中色散參數是由單位內錯誤估計請。對不起,如果這是顯而易見的,但我找不到任何東西。 – user20650

+0

@ user20650可能[在這裏](https://journal.r-project.org/archive/2016-1/giner-smyth.pdf)開始?他們有'φ=σ^ 2'。它*認爲*它也在頁面上。 McCullagh和Nelder的[廣義線性模型]中的30個(https://www.google.com/search?tbo=p&tbm=bks&q=isbn:0412317605)。看來一個流行的參數化是'λ= 1 /(σ^ 2)'。 – alexforrence

+0

謝謝。我曾經看過statmod ref(可惜我沒有McCullagh的書):我之前曾經用statmod的一個例子(我的問題的部分原因)搞砸了:'x = rinvgauss(1e6,mean = 1.5,dispersion = 0.7 )'。這似乎給出了單變量情況下的色散參數。 'var(x)/(mean(x)^ 3)'。並且運行一個基本的glm:'summary(m < - glm(mpg〜wt,data = mtcars,family = inverse.gaussian))'似乎表明參數不等於sigma(m)^ 2 '/ var(y | x)。這兩種方式都讓我開始認爲隨機誤差可能不是很正確。 – user20650