我试图在R中运行两个类似的广义线性混合模型.两个模型对于预测变量,协变量和随机因子具有相同的输入变量,但是,响应变量不同.型号需要lme4包装.Ben Bolker解决了第二个模型的问题.
在第一个模型中,响应变量是生物量重量和family = gaussian.
global.model <- lmer(ex.drywght ~ forestloss562*forestloss17*roaddenssec*nearestroadprim +
elevation + soilPC1 + soilPC2 +
(1|block/fragment),
data = RespPredComb,
family = "gaussian")
Predictors have the following units:
forestloss562 = %,
forestloss17 = %,
roaddenssec = (km/km2) and
nearestroadprim = (m).
Run Code Online (Sandbox Code Playgroud)
执行此模型会显示以下警告消息:
警告信息:
1:在glmer中(ex.drywght~forestloss562*forestloss17*roaddenssec*:调用glmer()与family = gaussian(身份链接)作为lmer()的快捷方式不推荐使用;请直接调用lmer()
2:一些预测变量的尺度非常不同:考虑重新缩放
然后我执行这些后续步骤(遵循Grueber等人(2011)中描述的步骤顺序:
我标准化预测因子,
stdz.model <- standardize(global.model, standardize.y = FALSE)
Run Code Online (Sandbox Code Playgroud)
(需要包装arm)
使用自动模型选择和所提供的"全局"模型的子集
model.set <- dredge(stdz.model)
Run Code Online (Sandbox Code Playgroud)
需要包(MuMIn)
在这里,我收到以下警告消息:
Warning message:
In dredge(stdz.model2) : comparing models fitted by REML
Run Code Online (Sandbox Code Playgroud)
找到前2个AIC型号和
top.models <- get.models(model.set, subset = delta < 2)
Run Code Online (Sandbox Code Playgroud)
进行模型平均
model.avg(model.set, subset = delta < 2)
Run Code Online (Sandbox Code Playgroud)
在这里,我收到此错误消息:
Error in apply(apply(z, 2L, is.na), 2, all) :
dim(X) must have a positive length
Run Code Online (Sandbox Code Playgroud)
任何关于如何可能修复此错误的建议都将非常感激.
在第二个模型中,响应变量是丰富度,家庭是泊松.
global.model <- glmer(ex.richness ~ forestloss562*forestloss17*roaddenssec*nearestroadprim +
elevation + soilPC1 + soilPC2 +
(1|block/fragment),
data = mydata,
family = "poisson")
Run Code Online (Sandbox Code Playgroud)
当我执行上面的命令时,我收到以下错误和警告消息:
错误:(maxstephalfit)PIRLS步骤减半未能减少pwrssUpdate中的偏差另外:警告消息:
1:一些预测变量的尺度非常不同:考虑重新缩放
2:在pwrssUpdate中(pp,resp,tolPwrss,GQmat,compDev,fac,verbose):文件中的Cholmod警告'not positive definite':../ Cholesky/t_cholmod_rowfac.c,第431行
3:在pwrssUpdate中(pp,resp,tolPwrss,GQmat,compDev,fac,verbose):文件中的Cholmod警告'not positive definite':../ Cholesky/t_cholmod_rowfac.c,第431行
请在下面找到我的数据的可重现子集:
structure(list(plot.code = structure(c(1L, 3L, 2L, 4L, 5L, 6L,
7L), .Label = c("a100m56r", "b1m177r", "c100m56r", "d1f1r", "e1m177r",
"f1m17r", "lf10m56r"), class = "factor"), site.code = structure(c(1L,
3L, 2L, 4L, 5L, 6L, 7L), .Label = c("a100m56", "b1m177", "c100m56",
"d1f1", "e1m177", "f1m17", "lf10m56"), class = "factor"), block = structure(c(1L,
3L, 2L, 4L, 5L, 6L, 7L), .Label = c("a", "b", "c", "d", "e",
"f", "lf"), class = "factor"), fragment = structure(c(1L, 3L,
2L, 4L, 5L, 6L, 7L), .Label = c("a100", "b1", "c100", "d1", "e1",
"f1", "lf10"), class = "factor"), elevation = c(309L, 342L, 435L,
495L, 443L, 465L, 421L), forestloss562 = c(25.9, 56.77, 5.32,
27.4, 24.25, 3.09, 8.06), forestloss17 = c(7.47, 51.93, 79.76,
70.41, 80.55, 0, 0), roaddenssec = c(2.99, 3.92, 2.61, 1.58,
1.49, 1.12, 1.16), nearestroadprim = c(438L, 237L, 2637L, 327L,
655L, 528L, 2473L), soilPC1 = c(0.31, -0.08, 1.67, 2.39, -1.33,
-1.84, -0.25), soilPC2 = c(0.4, 0.41, -0.16, 0.15, 0.03, -0.73,
0.51), ex.richness = c(0L, 0L, 1L, 7L, 0L, 0L, 1L), ex.drywght = c(0,
0, 1.255, 200.2825, 0, 0, 0.04)), .Names = c("plot.code", "site.code",
"block", "fragment", "elevation", "forestloss562", "forestloss17",
"roaddenssec", "nearestroadprim", "soilPC1", "soilPC2", "ex.richness",
"ex.drywght"), class = "data.frame", row.names = c(NA, -7L))
Run Code Online (Sandbox Code Playgroud)
tl; dr您需要在适合模型之前标准化变量,以获得更高的数值稳定性.我也有一些关于你正在做什么的可行性的评论,但我会把它们保存到最后......
source("SO_glmer_26904580_data.R")
library("arm")
library("lme4")
library("MuMIn")
Run Code Online (Sandbox Code Playgroud)
尝试第一次适合:
pmod <- glmer(ex.richness ~
forestloss562*forestloss17*roaddenssec*nearestroadprim +
elevation + soilPC1 + soilPC2 +
(1|block/fragment),
data = dat,
family = "poisson")
Run Code Online (Sandbox Code Playgroud)
如上所述,这失败了.但是,我收到上面没有报告的警告:
## 1: Some predictor variables are on very different scales: consider rescaling
Run Code Online (Sandbox Code Playgroud)
这提供了一个线索.
缩放数字参数:
pvars <- c("forestloss562","forestloss17",
"roaddenssec","nearestroadprim",
"elevation","soilPC1","soilPC2")
datsc <- dat
datsc[pvars] <- lapply(datsc[pvars],scale)
Run Code Online (Sandbox Code Playgroud)
再试一次:
pmod <- glmer(ex.richness ~
forestloss562*forestloss17*roaddenssec*nearestroadprim +
elevation + soilPC1 + soilPC2 +
(1|block/fragment),
data = datsc,
family = "poisson",
na.action="na.fail")
Run Code Online (Sandbox Code Playgroud)
这是有效的,虽然我们得到一个关于太大梯度的警告信息 - 我认为这实际上是可以忽略的(我们仍在努力使这些误差敏感度阈值正确).
据我所知,以下几行似乎正在起作用:
stdz.model <- standardize(pmod, standardize.y = FALSE)
## increases max gradient -- larger warning
model.set <- dredge(stdz.model) ## slow, but running ...
Run Code Online (Sandbox Code Playgroud)
以下是我对可行性的评论:
nrow(datsc) ## 159
ncol(getME(pmod,"X")) ## 19
Run Code Online (Sandbox Code Playgroud)
dredge在这种情况下,我不知道是否有任何事情可以尝试合理.)我也尝试过glmmLasso这个问题 - 它最终缩小了所有固定效果条款......
library("glmmLasso")
datsc$bf <- interaction(datsc$block,datsc$fragment)
glmmLasso(ex.richness ~
forestloss562+forestloss17+roaddenssec+nearestroadprim +
elevation + soilPC1 + soilPC2,
rnd=list(block=~1,bf=~1),
data = datsc,
family = poisson(),
lambda=500)
Run Code Online (Sandbox Code Playgroud)