R中用于受限范围相关系数校正的包或命令有哪些?
受限范围(左截断)相关系数校正的R实现方案
前提说明
你遇到的是自变量单侧左截断导致的相关系数低估问题,校正需要你提前获取aptitude变量在未截断全量总体中的标准差(或方差),如果没有现成的总体参数,可以先通过截断正态分布拟合估计总体参数。
方法1:使用psych包内置的rangeCorrection函数
psych是目前仍在稳定维护的心理与行为统计常用包,内置了范围校正的专用函数,使用方式如下:
步骤1:安装加载包、导入数据
# 安装包(仅需运行一次) install.packages("psych") # 加载包 library(psych) # 导入你的数据集 hw <- structure(list(aptitude = c(78, 85, 69, 80, 60, 72, 77, 65, 70, 80, 75, 83, 81, 65, 77, 76, 64, 68, 74, 85, 83, 80, 62, 69, 66, 75, 68, 70), performance = c(74, 59, 59, 60, 55, 62, 59, 64, 50, 64, 60, 59, 51, 64, 58, 49, 43, 62, 49, 59, 59, 60, 43, 62, 49, 64, 38, 74)), class = "data.frame", row.names = c(NA, -28L ))
步骤2:计算校正相关
这里假设你已经通过行业常模或分布拟合得到了全量总体中aptitude的标准差为12(请替换为你实际的总体标准差数值):
# 先计算观测到的截断样本的aptitude标准差 sd_x_restricted <- sd(hw$aptitude) # 替换为实际的全量总体aptitude标准差 sd_x_unrestricted <- 12 # 计算观测相关 r_obs <- cor(hw$aptitude, hw$performance) # 执行范围校正 r_corrected <- rangeCorrection(r = r_obs, sdr = sd_x_unrestricted/sd_x_restricted)
输出的r_corrected就是校正后的相关系数。
方法2:手动实现校正公式
如果你不想额外安装包,可以直接用桑代克Case A校正公式手动计算,和psych包的计算结果完全一致:
# 替换为你实际的总体aptitude标准差 sd_x_unrestricted <- 12 sd_x_restricted <- sd(hw$aptitude) r_obs <- cor(hw$aptitude, hw$performance) # 手动计算校正相关 sdr_ratio <- sd_x_unrestricted / sd_x_restricted r_corrected <- (r_obs * sdr_ratio) / sqrt(1 - r_obs^2 + r_obs^2 * sdr_ratio^2)
额外说明
- 如果你没有全量总体的
aptitude标准差,可以用MASS包的fitdistr函数拟合左截断正态分布,从现有样本反推总体的均值和标准差,再代入上述公式即可。 - 校正后相关的显著性可以通过自助法抽样估计置信区间判断,不需要专用函数支持。
内容的提问来源于stack exchange,提问作者Shawn Hemelstrand
相关产品推荐
相关产品推荐

