You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用lmer4拟合随机效应模型失败:非数值型变量问题求助

线性混合模型拟合问题:因变量非数值型报错解决

变量定义

  • 因变量y:正确响应的频率(对应数据列answers_correct为True的观测)
  • 自变量x:善意条件(对应数据列condition_benevolent为True),True代表善意实验条件,False代表恶意或随机实验条件

实验条件与正确响应频率分布

问题描述

尝试了以下代码拟合模型,但因变量非数值型,无法用lmer4计算随机效应模型:

#Linear mixed model benevolent

#data_with_id$condition_benevolent_numeric <- recode(data_with_id$condition_benevolent, "False"  = 0, "True" = 1)               

#n <- 480
x <- c(data_with_id$condition_benevolent)
data_with_id$condition_benevolent <- as.numeric(data_with_id$condition_benevolent == "A")
view(data_with_id$condition_benevolent)

x <- model.matrix(~x -1, data = data_with_id, drop.unused.levels = TRUE)[,-1] #dummycodierung, True=1
#frequ <- häufigkeit_richtig_df_benev

y <- data_with_id$answers_correct

model_H1.1_benevolent <- lmer(y ~ x + (1|trial), data=data_with_id) 
summary(model_H1.1_benevolent)

length(y)
length(x)
length(data_with_id$trial)
view(y)
view(x)
nrow(data_with_id)
nrow(data_with_id$condition_benevolent)
nrow(data_with_id$trial)

解决方案

核心问题是因变量answers_correct是逻辑型(True/False),而lmer要求因变量为数值型,同时原代码的自变量编码存在错误,以下是修正步骤:

1. 转换因变量为数值型

逻辑型变量直接用as.numeric()转换即可,True会自动转为1,False转为0:

data_with_id$answers_correct_num <- as.numeric(data_with_id$answers_correct)

2. 修正自变量编码

原代码中as.numeric(data_with_id$condition_benevolent == "A")是错误的,应该直接基于原逻辑型列转换:

data_with_id$condition_benevolent_num <- as.numeric(data_with_id$condition_benevolent)

也可以保留因子型,让lmer自动处理虚拟编码,效果一致。

3. 简化模型代码

不需要手动用model.matrix做虚拟编码,lmer可以直接处理数值型/逻辑型/因子型自变量,修正后的完整代码:

library(lmer4)

# 数据预处理
data_with_id$answers_correct_num <- as.numeric(data_with_id$answers_correct)
data_with_id$condition_benevolent_num <- as.numeric(data_with_id$condition_benevolent)

# 拟合线性混合模型
model_H1.1_benevolent <- lmer(answers_correct_num ~ condition_benevolent_num + (1|trial), 
                              data = data_with_id)

# 查看模型结果
summary(model_H1.1_benevolent)

额外说明

  • 如果你的answers_correct是每个观测的正确/错误标记(不是聚合后的频率),线性混合模型适用;如果是聚合后的正确次数(比如每个trial有多次响应的频率),建议用广义线性混合模型(glmer),指定二项分布:
    model_H1.1_benevolent_glmer <- glmer(answers_correct_num ~ condition_benevolent_num + (1|trial), 
                                         data = data_with_id, family = binomial)
    
  • 拟合前检查数据完整性:用data_with_id <- data_with_id[complete.cases(data_with_id),]删除含缺失值的行,避免维度不匹配报错。

内容的提问来源于stack exchange,提问作者Joy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 20:00:16