emmeans函数无法运行或运行时间太长

时间:2020-09-25 14:14:55

标签: r statistics linear-regression covariance

我是新来的。我想使用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函数一个多小时了,它仍然在运行。为什么要花这么长时间?

1 个答案:

答案 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)