如何在R中自动化实现嵌套变量的t-test并提取统计结果
解决方案
原代码错误说明
- 循环维度设置错误:你需要遍历的是
Age和Location两个分组变量,每个检验需要同时用到同一分组下的Control和Treatment两组数据,不需要遍历Treatment col_t_welch传参错误:该函数接收两个数值向量x(对照组数值)和y(处理组数值),不支持公式+subset的传参方式
修正后的for循环实现
library(matrixTests) set.seed(123) df1 <- data.frame(matrix(ncol = 4, nrow = 36)) x <- c("Age","Location","Treatment","Value") colnames(df1) <- x df1$Age <- as.factor(rep(c(1,2,3), each = 12)) df1$Location <- as.factor(rep(c("Central","North"), each = 6)) df1$Treatment <- as.factor(rep(c("Control","Treatment"), each = 3)) df1$Value <- round(rnorm(36,200,25),0) # 初始化结果框,和你期望的d2结构一致 d2 <- expand.grid(Age = factor(c(1,2,3)), Location = factor(c("Central","North")), mean_diff = NA, SE_diff = NA, pvalue = NA) # 遍历每个Age+Location组合 for (i in seq_len(nrow(d2))) { # 提取当前分组的子数据 sub_df <- df1[df1$Age == d2$Age[i] & df1$Location == d2$Location[i], ] # 分别提取对照组和处理组的Value control_val <- sub_df$Value[sub_df$Treatment == "Control"] treat_val <- sub_df$Value[sub_df$Treatment == "Treatment"] # 执行welch t检验 t_res <- col_t_welch(x = control_val, y = treat_val) # 写入结果 d2$mean_diff[i] <- t_res$mean.diff d2$SE_diff[i] <- t_res$stderr d2$pvalue[i] <- t_res$pvalue } # 查看结果 d2
更简洁的非循环实现(可选)
如果你不想写for循环,可以用dplyr的分组运算直接得到结果,代码更简洁易读:
library(dplyr) library(matrixTests) d2 <- df1 %>% group_by(Age, Location) %>% summarise( t_res = list(col_t_welch(x = Value[Treatment == "Control"], y = Value[Treatment == "Treatment"])), mean_diff = t_res[[1]]$mean.diff, SE_diff = t_res[[1]]$stderr, pvalue = t_res[[1]]$pvalue, .groups = "drop" ) %>% select(-t_res)
两种方法得到的结果和你示例中手动计算的d2完全一致。
内容的提问来源于stack exchange,提问作者tassones
相关产品推荐
相关产品推荐

