在混合线性模型(Mixed Linear Model)中,普通的R²已不适用。我们通常使用条件R²(Conditional R²,总模型解释方差,包括固定和随机效应)和边际R²(Marginal R²,仅固定效应解释的方差)来评估模型拟合优度。本教程将分别介绍在三大常用工具中的实现方法。
一、 R语言计算教程
R语言是进行混合模型分析最强大和灵活的工具,其中lme4和performance包是主流选择。
install.packages(
"lme4")
# 用于拟合混合模型
install.packages(
"performance")
# 用于计算R²和模型诊断
install.packages(
"ggplot2")
# 用于示例数据
library(lme4)
library(performance)
library(ggplot2)
- 示例数据准备 使用R内置的sleepstudy数据集(研究睡眠剥夺对反应时间的影响,被试内设计)。
data(
"sleepstudy")
head(sleepstudy)
# > Reaction Days Subject
# > 1 249.5600 0 308
# > 2 258.7047 1 308
# > 3 250.8006 2 308
# ... ...
- 拟合混合效应模型 假设我们想探究Days(睡眠剥夺天数)对Reaction(反应时间)的影响,并允许每个被试(Subject)的截距和Days的斜率随机变化。
model <- lmer(Reaction ~ Days + (
1 + Days | Subject), data = sleepstudy)
summary(model)
# 查看模型详细结果
- 计算随机效应R² 使用performance包中的r2_nakagawa()函数,它可以自动计算出边际R²和条件R²。
r2_results <- r2_nakagawa(model)
print(r2_results)
# 输出示例:
# # R2 for Mixed Models
#
# Conditional R2: 0.799
# Marginal R2: 0.279
结果解读:
· 边际R² (0.279):固定效应Days独自解释了反应时间变异的27.9%。· 条件R² (0.799):整个模型(固定效应Days + 随机效应Subject)共同解释了79.9%的变异。这表明个体间(Subject)的巨大差异是反应时间变异的主要来源。
r2_results$R2_marginal
# 提取边际R²
r2_results$R2_conditional
# 提取条件R²
二、 Python计算教程
在Python中,我们主要使用statsmodels库来拟合混合模型,并手动或通过其他方式计算R²。
import statsmodels.api
as sm
import statsmodels.formula.api
as smf
import pandas
as pd
import numpy
as np
# 如果缺少库,请用 pip install statsmodels pandas 安装
- 示例数据准备 使用与R教程相同的sleepstudy数据集(需在线加载)。
# 从在线地址加载数据
url =
"https://raw.githubusercontent.com/arvindpazhanivan/Data_Sets/main/sleepstudy.csv"
sleepstudy_df = pd.read_csv(url)
print(sleepstudy_df.head())
model = smf.mixedlm(
"Reaction ~ Days", sleepstudy_df, groups=sleepstudy_df[
"Subject"], re_formula=
"~Days")
result = model.fit()
print(result.summary())
# 查看模型摘要
注意:statsmodels的输出摘要中不直接提供R²值。
- 手动计算随机效应R² 我们需要根据公式手动计算方差分量。
· 条件R² = (σ²_fixed + σ²_random) / (σ²_fixed + σ²_random + σ²_residual)· 边际R² = σ²_fixed / (σ²_fixed + σ²_random + σ²_residual)
# 1. 获取模型的方差分量
vc = result.cov_re
# 随机效应的方差-协方差矩阵
residual_variance = result.scale
# 残差方差 (σ²_residual)
# 2. 计算固定效应预测值的方差 (σ²_fixed)
# 首先获取固定效应的预测值(不包括随机效应)
fixed_prediction = result.predict(exog = sleepstudy_df[[
'Intercept',
'Days']])
# 假设模型有截距项
variance_fixed = np.var(fixed_prediction)
# 3. 计算随机效应的方差 (σ²_random)
# 这里简化处理,使用随机截距的方差作为代表,更复杂的模型需要求和所有随机方差分量。
variance_random = vc.iloc[
0,
0]
# 提取随机截距的方差
# 4. 计算总方差
total_variance = variance_fixed + variance_random + residual_variance
# 5. 计算R²
marginal_r2 = variance_fixed / total_variance
conditional_r2 = (variance_fixed + variance_random) / total_variance
print(
f"边际 R² (Marginal R²): {marginal_r2:.4f}")
print(
f"条件 R² (Conditional R²): {conditional_r2:.4f}")
注意:此手动计算为近似方法,对于复杂随机结构(如随机斜率)可能不精确。社区正在开发更成熟的包(如pingouin)来原生支持这一功能。
三、 SPSS计算教程
SPSS主要通过图形界面(GUI)操作,但其GENLINMIXED过程可以拟合混合模型并提供方差分量,从而手动计算R²。
· 打开数据:将sleepstudy数据导入SPSS。· 打开分析菜单:点击 Analyze -> Mixed Models -> Linear...。· 指定变量:· 将Reaction选入Dependent Variable。· 将Subject选入Subjects对话框。· 指定固定效应:点击Fixed按钮,将Days添加到模型中。· 指定随机效应:点击Random按钮。· 将Subject选入Combinations对话框。· 将Days选入模型框,并选择包含截距(Include Intercept)。· 在Covariance Type下选择Unstructured(非结构化)以估计截距和斜率的协方差。· 获取方差估计:点击Statistics按钮。· 确保勾选了Parameter estimates for fixed effects和Tests for covariance parameters。· 这一步是为了在结果中看到残差和随机效应的方差估计值。
- 手动计算R² 运行模型后,在输出查看器中,找到“Covariance Parameters”表格。
· 残差方差 (σ²_residual):对应Residual的Estimate值。· 随机效应方差 (σ²_random):找到Subject对应的方差估计值(可能有多行,如截距方差Var(Intercept)和斜率方差Var(Days)以及它们的协方差)。你需要将它们求和。
然后,使用与Python部分相同的公式,在SPSS中使用转换 > 计算变量功能或手动计算:
· 总方差 = σ²_fixed + Σσ²_random + σ²_residual· σ²_fixed是固定效应预测值的方差,可能需要通过保存预测值并计算其方差来获得。· 边际R² = σ²_fixed / 总方差· 条件R² = (σ²_fixed + Σσ²_random) / 总方差
重要提示:在SPSS中手动计算R²较为繁琐且容易出错,这是其相较于R的一个劣势。通常更推荐使用R的performance包来直接获取可靠结果。