lme4 无法在没有警告的情况下计算随机拦截
lme4 fails to calculate random intercepts with no warnings
有一个特殊的问题,即给定 2 个具有完全相同格式的数据集,指定完全相同方式的 2 个模型不会产生相同的随机效应结构。数据的设计使得每个都有 48 个独特的主题,每个主题在 4 种条件下进行一次观察。结果变量是“dv”列,预测变量是“cond”列,分组变量是“sub”列。
第一个模型按预期运行,使用 coef(model) 检查对象级别随机截距,而另一个假设所有对象的截距都是固定的。尽管事实上这两个模型的指定是相同的。没有收敛或方差问题警告,而且受试者实际上有不同的均值(所有 4 种条件下的平均响应),因此截距应该有所不同。
取出数据集的前 33 行(即条件 0 内的前 33 个对象)使 lme4 正确计算随机截距。然而,我似乎无法将其隔离到一个奇怪的数据点,并且模型之间的所有类型和代码都是相同的。完全不知道为什么一个奇怪的数据点(如果这真的是问题所在)应该混淆 lme4 如何计算随机效应。
请参阅下面的代码以重现以下数据文件的问题:
data files (zip)
library('lme4')
data_dir = '/Path/to/data/dir/'
#Load in data and set types
goodDat = read.csv(paste(data_dir,'ROI_2_noX.csv',sep=""))
goodDat$dv <-as.numeric(goodDat$dv)
goodDat$cond <- as.factor(goodDat$cond)
#4 levels make the first the reference
goodDat$cond <- relevel(goodDat$cond,ref="0");
goodDat$sub <- as.factor(goodDat$sub)
#Same for bad example
badDat = read.csv(paste(data_dir,'ROI_3_noX.csv',sep=""))
#badDat = badDat[34:192,] #This works! uncomment it to see the proper random effects in the second model
badDat$dv <-as.numeric(badDat$dv)
badDat$cond <- as.factor(badDat$cond)
#4 levels make the first the reference
badDat$cond <- relevel(badDat$cond,ref="0");
badDat$sub <- as.factor(badDat$sub)
#Good model with expected random intercepts for subjects
model = lmer('dv~cond + (1|sub)',data=goodDat)
summary(model)
coef(model)
#Bad model with no subject random intercepts
model = lmer('dv~cond + (1|sub)',data=badDat)
summary(model)
coef(model)
在某些情况下,lmer
参数的数值估计可能会出现问题。用lmerControl
改变优化算法的参数或改变优化算法可能是解决问题的好方法。
下面我尝试使用 optim
优化器使用包 nlme
中的 lme
函数估计 badDat
上的混合效应模型的参数:
library(nlme)
model2 = lme(fixed = dv ~ cond, random = ~ 1 | sub, data=badDat,
control=lmeControl(opt="optim"))
summary(model2b)
#####################
Linear mixed-effects model fit by REML
Data: badDat
AIC BIC logLik
522.909 542.3277 -255.4545
Random effects:
Formula: ~1 | sub
(Intercept) Residual
StdDev: 0.008620485 0.9036019
Fixed effects: dv ~ cond
Value Std.Error DF t-value p-value
(Intercept) 0.19443385 0.1304296 141 1.4907183 0.1383
cond1 -0.00074922 0.1844470 141 -0.0040620 0.9968
cond2 0.15675844 0.1844470 141 0.8498835 0.3968
cond3 0.19542024 0.1844470 141 1.0594928 0.2912
Correlation:
(Intr) cond1 cond2
cond1 -0.707
cond2 -0.707 0.500
cond3 -0.707 0.500 0.500
Standardized Within-Group Residuals:
Min Q1 Med Q3 Max
-3.9838652 -0.6574260 -0.0112212 0.6733073 3.8501157
Number of Observations: 192
Number of Groups: 48
估计的随机截距非常相似,但并不像以前一样全部相等:
coef(model2b)
################
(Intercept) cond1 cond2 cond3
4 0.1943937 -0.0007492168 0.1567584 0.1954202
5 0.1942458 -0.0007492168 0.1567584 0.1954202
6 0.1944388 -0.0007492168 0.1567584 0.1954202
7 0.1943862 -0.0007492168 0.1567584 0.1954202
10 0.1945275 -0.0007492168 0.1567584 0.1954202
11 0.1943091 -0.0007492168 0.1567584 0.1954202
12 0.1943333 -0.0007492168 0.1567584 0.1954202
13 0.1941818 -0.0007492168 0.1567584 0.1954202
14 0.1942539 -0.0007492168 0.1567584 0.1954202
15 0.1947154 -0.0007492168 0.1567584 0.1954202
希望对您有所帮助。
有一个特殊的问题,即给定 2 个具有完全相同格式的数据集,指定完全相同方式的 2 个模型不会产生相同的随机效应结构。数据的设计使得每个都有 48 个独特的主题,每个主题在 4 种条件下进行一次观察。结果变量是“dv”列,预测变量是“cond”列,分组变量是“sub”列。
第一个模型按预期运行,使用 coef(model) 检查对象级别随机截距,而另一个假设所有对象的截距都是固定的。尽管事实上这两个模型的指定是相同的。没有收敛或方差问题警告,而且受试者实际上有不同的均值(所有 4 种条件下的平均响应),因此截距应该有所不同。
取出数据集的前 33 行(即条件 0 内的前 33 个对象)使 lme4 正确计算随机截距。然而,我似乎无法将其隔离到一个奇怪的数据点,并且模型之间的所有类型和代码都是相同的。完全不知道为什么一个奇怪的数据点(如果这真的是问题所在)应该混淆 lme4 如何计算随机效应。
请参阅下面的代码以重现以下数据文件的问题: data files (zip)
library('lme4')
data_dir = '/Path/to/data/dir/'
#Load in data and set types
goodDat = read.csv(paste(data_dir,'ROI_2_noX.csv',sep=""))
goodDat$dv <-as.numeric(goodDat$dv)
goodDat$cond <- as.factor(goodDat$cond)
#4 levels make the first the reference
goodDat$cond <- relevel(goodDat$cond,ref="0");
goodDat$sub <- as.factor(goodDat$sub)
#Same for bad example
badDat = read.csv(paste(data_dir,'ROI_3_noX.csv',sep=""))
#badDat = badDat[34:192,] #This works! uncomment it to see the proper random effects in the second model
badDat$dv <-as.numeric(badDat$dv)
badDat$cond <- as.factor(badDat$cond)
#4 levels make the first the reference
badDat$cond <- relevel(badDat$cond,ref="0");
badDat$sub <- as.factor(badDat$sub)
#Good model with expected random intercepts for subjects
model = lmer('dv~cond + (1|sub)',data=goodDat)
summary(model)
coef(model)
#Bad model with no subject random intercepts
model = lmer('dv~cond + (1|sub)',data=badDat)
summary(model)
coef(model)
在某些情况下,lmer
参数的数值估计可能会出现问题。用lmerControl
改变优化算法的参数或改变优化算法可能是解决问题的好方法。
下面我尝试使用 optim
优化器使用包 nlme
中的 lme
函数估计 badDat
上的混合效应模型的参数:
library(nlme)
model2 = lme(fixed = dv ~ cond, random = ~ 1 | sub, data=badDat,
control=lmeControl(opt="optim"))
summary(model2b)
#####################
Linear mixed-effects model fit by REML
Data: badDat
AIC BIC logLik
522.909 542.3277 -255.4545
Random effects:
Formula: ~1 | sub
(Intercept) Residual
StdDev: 0.008620485 0.9036019
Fixed effects: dv ~ cond
Value Std.Error DF t-value p-value
(Intercept) 0.19443385 0.1304296 141 1.4907183 0.1383
cond1 -0.00074922 0.1844470 141 -0.0040620 0.9968
cond2 0.15675844 0.1844470 141 0.8498835 0.3968
cond3 0.19542024 0.1844470 141 1.0594928 0.2912
Correlation:
(Intr) cond1 cond2
cond1 -0.707
cond2 -0.707 0.500
cond3 -0.707 0.500 0.500
Standardized Within-Group Residuals:
Min Q1 Med Q3 Max
-3.9838652 -0.6574260 -0.0112212 0.6733073 3.8501157
Number of Observations: 192
Number of Groups: 48
估计的随机截距非常相似,但并不像以前一样全部相等:
coef(model2b)
################
(Intercept) cond1 cond2 cond3
4 0.1943937 -0.0007492168 0.1567584 0.1954202
5 0.1942458 -0.0007492168 0.1567584 0.1954202
6 0.1944388 -0.0007492168 0.1567584 0.1954202
7 0.1943862 -0.0007492168 0.1567584 0.1954202
10 0.1945275 -0.0007492168 0.1567584 0.1954202
11 0.1943091 -0.0007492168 0.1567584 0.1954202
12 0.1943333 -0.0007492168 0.1567584 0.1954202
13 0.1941818 -0.0007492168 0.1567584 0.1954202
14 0.1942539 -0.0007492168 0.1567584 0.1954202
15 0.1947154 -0.0007492168 0.1567584 0.1954202
希望对您有所帮助。