指定混合效应模型中不同组的相关结构 (lme4/nlme)

机器算法验证 r 混合模式 自相关 空间的 lme4-nlme
2022-01-29 15:22:45

我试图在 R 中的线性混合效应模型中解释空间自相关,并及时重复测量。在4 年的时间里,每150 种不同的产品中BodyMass收集一次。时间自相关应该可以忽略不计,因为体重测量是从死去的动物身上进行的。YearSites

由于 中的模型correlation=不接受表单的相关结构,因此我尝试从较旧的包中取而代之。lmer()lme4lme()nlme

我的基线模型如下所示:

library(nlme)
M1 <- lme(BodyMass~Year, data=df, random=~1|Site)

现在我想考虑空间自相关,考虑分组的空间位置(由于 4 年的周期,每个坐标组合重复 4 次)。但是,此语法不起作用:

M2 <- lme(BodyMass~Year, data=df, random=~1|Site, correlation=corAR1(form=~x+y|Year))

它给出了以下错误:

Error in lme.formula(BodyMass ~ 1, data = df, random = ~1 | Site,  :
incompatible formulas for groups in 'random' and 'correlation'

根据 Ben Bolker在此处的回答,该错误的原因是

lme()坚持随机效应和相关性的分组变量是相同的。

然而,在我的模型中,使用相同的分组变量是没有意义的,因为年份正在对相关结构进行分组(通过重复坐标),而年份不适合作为随机因素,因为它们仅包含 4 个级别(如这里讨论)。

正如这里所建议的那样,使用gls()代替对我来说不是真正的选择,因为我需要考虑随机因素并且喜欢使用 R 平方,这只能在普通最小二乘 (OLS) 方法中使用。Site

(1) 你知道在这种情况下如何解释空间自相关,保持我的随机因子以及 OLS 框架能够计算 R 平方值吗?

非常感谢您的帮助!

编辑: AdamO回答lme4nlme链接之间的差异时写道:

“三巨头”相关结构:独立、可交换和 AR-1 相关结构很容易被这两个包处理。

(2) 如何将这些“三大”相关结构包含在 中lme4

我认为如果实际上可以在其中处理空间自相关,则可以nlme通过使用来规避分组变量问题。lme4

编辑2:我发现如下更改相关结构的分组变量可以使模型正常工作而不会出现错误:

M3 <- lme(BodyMass~Year, data=df, random=~1|Site, correlation=corAR1(form=~x+y|Site/Year))

(3) 相关结构中分组变量的这个表达式是否有意义?

我不完全确定它是否确实如此,因为在一个随机因素中,|Site/Year这意味着该年份嵌套在站点内,但我认为年份和站点宁愿交叉,因为每个站点每年都有代表。

1个回答

另一种非常灵活的方法是贝叶斯。您可以使用 JAGS 在 R 中实现它(除了一个包之外,您还必须通过一些步骤来下载)。如果你这样做,你可以指定任何你想要的相关结构。

要以这种方式构建它,您可以 1) 将空间相关的结果视为多元正态模型的一部分(现在 y 有 2 个维度,即结果和空间)。2) 为具有自己相关结构的模型添加另一个空间随机分量。

例如,您可以修改 (2) 的代码并在 R 中构建一个随机截距和斜率模型。每个人都由 i 索引(例如 anx 1 向量),您还可以提供他们的空间索引的另一个 nx1 向量(称为 site_indicator) . 您还需要提供站点总数。

model_RIAS_MVN<-"
model{
#Likelihood
for(i in 1:N_tot) {# all obs
# outcome is normally distributed
bodymass ~ dnorm(mu, sigmainverse)

# outcome model
mu <- b[1] + RI[subj_num[i], 1] + b[2]*Age[i] + RI[subj_num[i], 2]*Age[i] + RandomSpace[site_indicator[i]]
}

# Prior for random intercepts and slopes 
# this allows them to be correlated 
for (j in 1:N_people) {
RI[j, 1:2] ~ dmnorm(meanU[1:2], G.inv[1:2, 1:2])
}

# CHANGE HERE FOR NEW SITE CORRELATION #
# change number_sites in meanspace and G.invspace to actual number bc it # could throw error
for (j in 1:number_sites) {
RandomSpace[j] ~ dmnorm(meanspace[1:number_sites], G.invspace[1:number_sites, 1:number_sites])
}

for(i in 1:2){
meanU[i] <- 0 # zero mean for random components
}

G.inv[1:2, 1:2] ~ dwish(G0[1:2, 1:2], Gdf)
G[1:2, 1:2] <- inverse(G.inv[1:2, 1:2])

# whatever structure you want for correlation
G.invspace[1:number_sites, 1:number_sites] ~ dwish(G0inv[1:number_sites, 1:number_sites], Gdf_space)
Gspace[1:number_sites, 1:number_sites] <- inverse(G.invspace[1:number_sites, 1:number_sites])

sigmainverse ~ dgamma(1,1)

# informative priors for fixed effects
b[1] ~ dnorm(20, 0.25)          
b[2] ~ dnorm(1, 4)    

# uncomment for uninformative priors
# b[1] ~ dnorm(0, 0.01)          
# b[2] ~ dnorm(0, 0.01)              
}

这只是工作代码,需要对其进行调整,但希望您了解灵活性以及如何以这种方式指定相关结构。