我正在试图弄清楚我是否可以为一个项目使用多水平模型,我需要模拟一些数据,拟合一个随机效果模型,然后 for each 组(在我的情况下是参与者或受试者)生成边际效果.然而,我似乎不能从我的模型匹配中产生不同的边际影响,尽管它与一个工作示例(例如,睡眠研究)相匹配.

睡眠研究提供了一个很好的起点:

library(tidyverse)
library(lme4)
library(ggeffects)

data("sleepstudy")
m <- lmer(Reaction ~ Days + (1 + Days | Subject), data = sleepstudy)
me <- ggpredict(m, terms = c("Days", "Subject [sample=8]"), type = "random")
plot(me)

varying slopes from sleepstudy

该图展示了八个不同主题的八个不同的斜坡.

然而,如果我模拟的数据与睡眠研究大致匹配,我的模型拟合不会产生不同的斜率,我不知道为什么不:

N = 18 # Number of people
Nt = 9 # Number of trials

d <- tibble(
  Subject = factor(sprintf("%03d", 1:N)),       # create subject numbers
  subj_b0 = rnorm(n = N, mean = 250, sd = 20),  # create random intercepts
  subj_b1 = rnorm(n = N, mean = 10, sd = 6)     # create random slopes       
) %>%                                           
  mutate(Days = list(0:Nt)) %>%
  unnest(Days) %>%
  mutate(
    Y = subj_b0 + Days*subj_b1,
    Y = Y + rnorm(n = nrow(.), sd = 15)          # Add error
  )    

fit <- lmer(Y ~ 1 + Days + (1 + Days|Subject), data = d)
p <- ggpredict(fit, terms = c("Days", "Subject [sample=8]"), type = "random")
plot(p)

non-varying slopes from simulated data

我无论如何也弄不明白为什么ggpredict()对每个科目都返回相同的斜率.

模型总结证实,斜坡周围有几天的变化,据我所知,其他估计参数与睡眠研究类似.

summary(fit)

Linear mixed model fit by REML ['lmerMod']
Formula: Y ~ 1 + Days + (1 + Days | Subject)
   Data: d

REML criterion at convergence: 1553.3

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-2.57322 -0.57070 -0.01073  0.59463  3.02611 

Random effects:
 Groups   Name        Variance Std.Dev. Corr
 Subject  (Intercept) 745.22   27.30        
          Days         37.95    6.16    0.12
 Residual             176.54   13.29        
Number of obs: 180, groups:  Subject, 18

Fixed effects:
            Estimate Std. Error t value
(Intercept)  254.517      6.693  38.030
Days           9.033      1.492   6.053

sleepstudy模型比较总结:

summary(m)

Linear mixed model fit by REML ['lmerMod']
Formula: Reaction ~ Days + (1 + Days | Subject)
   Data: sleepstudy

REML criterion at convergence: 1743.6

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-3.9536 -0.4634  0.0231  0.4634  5.1793 

Random effects:
 Groups   Name        Variance Std.Dev. Corr
 Subject  (Intercept) 612.10   24.741       
          Days         35.07    5.922   0.07
 Residual             654.94   25.592       
Number of obs: 180, groups:  Subject, 18

Fixed effects:
            Estimate Std. Error t value
(Intercept)  251.405      6.825  36.838
Days          10.467      1.546   6.771

推荐答案

看起来ggpredict()不能处理因素(随机效应),它是"数字"的,但有像001,002这样的级别.这似乎是一个错误,我会看看如何修复这个问题.

解决方法是将级别更改为Subject:

library(ggeffects)
library(easystats)
library(lme4)

N = 18 # Number of people
Nt = 9 # Number of trials

d <- data.frame(
  Subject = factor(1:N),                        # create subject numbers
  subj_b0 = rnorm(n = N, mean = 250, sd = 20),  # create random intercepts
  subj_b1 = rnorm(n = N, mean = 10, sd = 6)     # create random slopes       
) |>
  data_modify(Days = list(0:Nt)) |>
  tidyr::unnest(Days) |>
  data_modify(
    Y = subj_b0 + Days*subj_b1,
    Y = Y + rnorm(n = N * (Nt + 1), sd = 15)          # Add error
  )

fit <- lmer(Y ~ 1 + Days + (1 + Days|Subject), data = d)
p <- ggpredict(fit, terms = c("Days", "Subject [sample=8]"), type = "random")
plot(p)

创建于2023-11-03与reprex v2.0.2

R相关问答推荐

使用long()在dØr中过滤后获取元素数量

在集合群体模型中计算时间步依赖的速率/参数

从R中的地址提取街道名称

如何判断R中一列的值是否在所有其他列中重复?

从字符载体创建函数参数

使用gggplot 2在R中重新调整面板和y轴文本大小

在ggplot Likert条中添加水平线

在发布到PowerBI Service时,是否可以使用R脚本作为PowerBI的数据源?

根据选中三个复选框中的一个或两个来调整绘图

基于多列将值链接到NA

R-更新面内部的栅格值

如何使用STAT_SUMMARY向ggplot2中的密度图添加垂直线

如何编辑gMarginal背景以匹配绘图背景?

在数组索引上复制矩阵时出错

R spatstat Minkowski Sum()返回多个边界

如何在R库GoogleDrive中完全删除预先授权的Google帐户?

在R中,我如何使用滑动窗口计算位置,然后进行过滤?

如何计算R glm probit中的线性预测因子?

优化从每个面的栅格中提取值

如何使用ggplot2根据绘图中生成的斜率对小平面进行排序?