我是新来的。我想使用emmeans
函数基于模型计算估计的边际均值。此模型由lmer
函数完成。问题是我有很多(20ish)固定效应变量和一个随机效应变量。我可以毫无问题地运行lmer
。顺便说一下,我在运行lmer
之前将20ish类别变量设置为因子。当我使用emmeans
时,错误显示
错误:无法分配大小为49391.4 Gb的向量
我知道这是内存问题。如果我使用2-3个变量来构建模型,则emmeans函数将运行,尽管需要20分钟才能完成。数据集很大(20 k)。有人经历过同样的事情吗?还是我应该使用其他功能?反正有使其在R中工作吗?我是spss用户,似乎计算它并不需要花很长时间,我不明白为什么我不能在R中运行它。
我的R脚本如下:
mod1 <- lmer(overall ~ age + gender + job + a + b + ... + c + (1 | groupcode), data=dat, REML=T)
res1 <- emmeans::emmeans(mod1, specs = "age")
res2 <- emmeans::emmeans(mod1, specs = "gender")
...
跟进: 嗨,我在网上找到了一些免费数据,因此我可以尝试重现该问题。我无法100%复制此问题,但是它显示了emmeans函数花费太长时间的问题。如果我有一个更大的数据集并带有更多变量,它将根本无法运行。这是代码:
library(dplyr)
library(stringr)
rm(list = ls())
#data source
#http://www.bristol.ac.uk/cmm/learning/support/datasets/
#bottom of the page: Multilevel ordinal models for examination grades database (zip, 0.9 mb)
#unzip the file and saved under cc:\momeg\
#I used file :a-level-geography.txt
#import data
dat <- read.csv("C:\\momeg\\a-level-geography.txt", header = FALSE, sep = "")
#assign column names
colnames(dat) <- c("A-SCORE", "BOARD", "GCSE-G-SCORE", "GENDER", "GTOT", "GNUM", "GCSE-MA-MAX", "GCSE-math-n", "AGE",
"INST-GA-MN", "INST-GA-SD", "INSTTYPE", "LEA", "INSTITUTE", "STUDENT") %>%
tolower(.) %>%
str_replace_all(., "-", "_")
#number of records
nrow(dat)
#centering score
dat$'a_score' <- dat$'a_score'- mean(dat$'a_score')
#setup catorgorical variables as factor
dat$gender <- factor(dat$gender)
dat$age <- factor(dat$age)
dat$gcse_g_score <- factor(dat$gcse_g_score)
dat$gcse_math_n <- factor(dat$gcse_math_n)
dat$insttype <- factor(dat$insttype)
library(lme4)
library(emmeans)
#run model
mod1 <- lmer(a_score ~ age + gender + gcse_g_score + gcse_math_n + insttype + (1 | institute), data=dat, REML=T)
summary(mod1)
#get emmean
emm_options(pbkrtest.limit = 50000) #increase the limit to aviod note about d.f to be disabled.
start.time <- Sys.time() #figure out how long it taks r to run the emmeans function
age.means <- emmeans::emmeans(mod1, specs = "age")
end.time <- Sys.time()
time.taken <- end.time - start.time
time.taken
我已经运行emmeans函数一个多小时了,它仍然在运行。为什么要花这么长时间?
答案 0 :(得分:0)
不确定这是否完全相同,但是在我尝试过的少数情况下,它似乎很相似。最大的区别在于所使用的自由度,ggpredict()
不对DF使用Kenward-Roger(或任何其他)校正。
library(lme4)
fm2 <- lmer(Reaction ~ Days + (Days || Subject), sleepstudy)
emmeans::emmeans(fm2, specs="Days")
# Days emmean SE df lower.CL upper.CL
# 4.5 299 8.88 25 280 317
#
# Degrees-of-freedom method: kenward-roger
# Confidence level used: 0.95
library(ggeffects)
m <- mean(sleepstudy$Days)
ggpredict(fm2, terms="Days [m]")
# # Predicted values of Reaction
# # x = Days
#
# x | Predicted | SE | 95% CI
# ------------------------------------------
# 4.50 | 298.51 | 8.88 | [281.11, 315.91]
#
# Adjusted for:
# * Subject = 0 (population-level)