R语言如何使用for循环计算每位受试者的Pearson相关系数
原代码问题说明
原代码无法输出单被试单独相关结果,核心问题有两个:
- 循环遍历每个受试者ID时,没有针对当前ID筛选对应的数据子集,
cor.test()每次调用都传入了全量样本的两个变量值,因此每次输出的都是所有被试的整体相关结果 - 打印结果的语句中引用了未定义的
subj对象,属于笔误,循环内当前遍历到的受试者ID实际存储在你定义的循环变量i中
修正后的for循环实现
下面的代码既可以实时打印每个被试的结果,也会把所有结果规整存储为数据框,方便后续导出、做统计分析:
# 初始化空结果表存储所有被试的计算结果 cor_res <- data.frame( subject = character(), pearson_r = numeric(), p_val = numeric(), stringsAsFactors = FALSE ) # 遍历所有唯一的受试者ID for (subj_id in unique(adult_pref_1$subject)){ # 提取当前受试者的全部120个试次数据 current_data <- adult_pref_1[adult_pref_1$subject == subj_id, ] # 计算当前被试两个变量的Pearson相关 cor_output <- cor.test(current_data$own_pref, current_data$profile_rating_new) # 将结果追加到结果表中 cor_res <- rbind( cor_res, data.frame( subject = subj_id, pearson_r = as.numeric(cor_output$estimate), p_val = cor_output$p.value ) ) # 打印当前被试的计算结果 print(paste( "受试者ID:", subj_id, " Pearson相关系数:", round(as.numeric(cor_output$estimate), 3), " p值:", round(cor_output$p.value, 4) )) } # 所有循环运行完成后,可直接查看全部被试的结果汇总表 View(cor_res)
更简洁的可选实现
如果不想手动写for循环,可以借助dplyr包的分组计算逻辑,代码更简洁,也不容易出现索引、筛选相关的笔误:
# 若未安装dplyr,先运行下一行代码安装 # install.packages("dplyr") library(dplyr) cor_res_tidy <- adult_pref_1 %>% group_by(subject) %>% summarise( pearson_r = cor.test(own_pref, profile_rating_new)$estimate, p_val = cor.test(own_pref, profile_rating_new)$p.value, .groups = "drop" )
注意:如果个别受试者的数据存在变量无变异、缺失值过多的情况,
cor.test()会抛出报错,可提前按被试做数据清洗,或给相关计算加异常捕获逻辑,确保所有被试都有足够的有效试次参与计算。
内容的提问来源于stack exchange,提问作者Shannon Cahalan
相关产品推荐
相关产品推荐

