线性混合效应模型ICC计算报错求助:参数行数不匹配问题
线性混合效应模型(LMM)组内相关系数(ICC)计算报错问题
问题背景
我刚接触线性混合效应模型(LMM),需要报告组内相关系数(ICC)。下载了多个R包尝试计算,但执行代码时失败。
执行代码及报错信息
执行的计算代码:
ICC(DF, missing = T)
出现的错误及警告:
Error in data.frame(x.s, subs = rep(paste("S", 1:n.obs, sep = ""), nj)) :
arguments imply differing number of rows: 898, 2245
In addition: Warning message:
In stack.data.frame(x) : non-vector columns will be ignored
数据示例
DF <- structure(list(ID = c("SR6", "YLG19", "YLG19", "SR5", "SR2", "TG5", "FB7", "SR9", "KBU15", "FB5"), sub_group = structure(c(2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L), .Label = c("European Bullhead", "Salmonids"), class = "factor"), taxa = c("salmo.trutta", "oncorhynchus.mykiss", "oncorhynchus.mykiss", "salmo.trutta", "salmo.trutta", "salmo.trutta", "cottus.gobio", "cottus.gobio", "cottus.gobio", "cottus.gobio" ), sampling.site = c("oberer.seebach.ritrodat", "ybbs.lunz.grossau", "ybbs.lunz.grossau", "oberer.seebach.ritrodat", "oberer.seebach.ritrodat", "tagles.unten", "faltlbach", "oberer.seebach.ritrodat", "kothbergbach.unten", "faltlbach"), body_weight_g = c(4L, 8L, 8L, 20L, 26L, 42L, 6L, 10L, 4L, 6L), PUFA = structure(c(3L, 4L, 2L, 3L, 2L, 1L, 3L, 1L, 4L, 3L), .Label = c("SDA", "EPA", "ARA", "DHA"), class = "factor"), organ = structure(c(2L, 3L, 3L, 3L, 4L, 4L, 4L, 3L, 1L, 3L ), .Label = c("Brain", "Eyes", "Liver", "Muscles"), class = "factor"), isotopic_value = c(-36.7301983, -39.5973755, -40.549113, -35.6261828, -36.4038883, -46.085506, -39.0796303, NA, -41.6335499, -41.484535)), row.names = c(289L, 488L, 487L, 280L, 242L, 367L, 52L, 308L, 189L, 19L), class = "data.frame")
计划拟合的LMM公式
isotopic_value ~ organ + body_weight_g + (1 | ID)
错误原因
你使用的ICC()函数(多数是psych包中的实现)默认会对数据框内所有列进行处理,它的设计场景是计算评分者信度或重复测量的ICC,而非针对LMM模型的随机效应ICC。你的数据包含多个分类变量(factor)和重复测量结构,函数试图将所有列堆叠处理时,因列类型和行数不匹配触发报错。
解决方案
LMM的ICC是随机效应方差与总方差(随机效应方差+残差方差)的比值,需要基于拟合好的LMM模型计算,而非直接传入原始数据框。以下是两种可行方法:
方法1:使用performance包(推荐)
# 安装并加载所需包 install.packages(c("lme4", "performance")) library(lme4) library(performance) # 先清理缺失值(LMM拟合会自动忽略NA,但提前清理更清晰) DF_clean <- na.omit(DF) # 拟合LMM模型 model <- lmer(isotopic_value ~ organ + body_weight_g + (1 | ID), data = DF_clean) # 计算ICC icc(model)
方法2:手动计算方差分量
如果不想额外安装包,可以手动提取模型的方差分量计算:
# 加载lme4包并拟合模型 library(lme4) DF_clean <- na.omit(DF) model <- lmer(isotopic_value ~ organ + body_weight_g + (1 | ID), data = DF_clean) # 提取方差分量 var_comp <- VarCorr(model) var_id <- as.numeric(var_comp$ID) # ID组的随机效应方差 var_resid <- attr(var_comp, "sc")^2 # 残差方差 # 计算ICC icc_value <- var_id / (var_id + var_resid) cat("ICC值:", round(icc_value, 3), "\n")
内容的提问来源于stack exchange,提问作者Nadiine El Nino
相关产品推荐
相关产品推荐

