嵌套拟合lmer模型时无法访问cyl变量的问题求助
问题原因与解决方法
错误原因
nest_by数据结构问题:用nest_by(vs)分组后,数据会拆分为每行对应一个vs水平,每行包含vs列和一个嵌套的data列——cyl、disp等变量都在这个data子数据框里。你在do里直接把.传给lmer,.指代的是当前行的完整数据(包含vs和data),并非嵌套的data子框,所以lmer找不到cyl这类变量。- 随机效应
(1 | vs)冗余:已经按vs分组建模,每个分组内的vs是单一固定值,随机效应需要多个不同水平来估计变异,这个项本身就不合理,无法被模型识别。
修正后的代码
方法一:用map替代do(tidyverse现代推荐写法)
mtcars %>% mutate(vs = factor(vs), gear = factor(gear), carb = factor(carb), am = factor(am), cyl = factor(cyl)) %>% nest_by(vs) %>% mutate(fit = map(data, ~lmer(mpg ~ cyl + disp + hp + (1 | am), data = .x)))
方法二:修正do的用法(明确指定数据来源)
mtcars %>% mutate(vs = factor(vs), gear = factor(gear), carb = factor(carb), am = factor(am), cyl = factor(cyl)) %>% nest_by(vs) %>% do(fit = lmer(mpg ~ cyl + disp + hp + (1 | am), data = .$data))
关键说明
- 必须移除
(1 | vs):分组后每个模型的vs无变异,保留这个项会导致模型无法估计,甚至触发额外错误。 - 要让
lmer读取嵌套在data列里的变量,需明确指定data参数指向该子数据框。
内容的提问来源于stack exchange,提问作者12666727b9
相关产品推荐
相关产品推荐

