如何在R中复现SAS Proc GLM的无自变量多因变量重复测量分析?
在R中复现SAS的重复测量多变量GLM分析
你之前用lm(cbind(a, b, c) ~ 1)配合car::Manova得到的是单样本MANOVA,检验的是总体均值向量是否为0,这和SAS中proc glm的repeated shoe逻辑完全不同——SAS代码做的是单因素重复测量MANOVA,核心是检验3个被试内变量(a/b/c对应shoe的3个水平)的均值是否相等,因此分子自由度为2(3个水平的独立对比数),分母自由度为4((被试数-1)-(水平数-1)=5-2=4)。
以下是两种能复现SAS结果的方法:
方法1:用长格式数据拟合重复测量模型(推荐)
先将宽格式数据转换为长格式,明确被试内因素shoe,再用car::Anova做多变量检验:
library(tidyr) library(car) # 转换为长格式数据 track_long <- pivot_longer(track, cols = c(a, b, c), names_to = "shoe", values_to = "value") # 拟合重复测量模型,Error(ID/shoe)指定被试内结构 mod_rep <- lm(value ~ shoe + Error(ID/shoe), data = track_long) # 提取多变量检验结果(对应SAS的repeated输出) Anova(mod_rep, type = "III", multivariate = TRUE)
方法2:手动构造对比矩阵做MANOVA
直接针对"三个均值相等"的假设构造对比,再做单样本MANOVA:
# 构造对比矩阵:检验a=b、a=c(两个独立对比) contr_matrix <- matrix(c(1, -1, 0, 1, 0, -1), ncol = 2) # 计算每个被试的对比得分 contr_scores <- as.matrix(track[, c("a", "b", "c")]) %*% contr_matrix # 检验对比得分的均值是否为0(等价于检验三个原始变量均值相等) mod_contr <- manova(contr_scores ~ 1) summary(mod_contr, test = "Wilks")
两种方法都会得到分子自由度2、分母自由度4的结果,和SAS代码的输出一致。
内容的提问来源于stack exchange,提问作者Sulaimon Kasali
相关产品推荐
相关产品推荐

