全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 R语言论坛
301 0
2025-08-28

在混合线性模型(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包来直接获取可靠结果。


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群