使用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
相关产品推荐
相关产品推荐

