R语言cor()函数不同调用方式下相关性结果不一致的原因
问题原因解析
核心差异来自cor()函数中use="complete.obs"参数在不同输入类型下的行为不同:
- 当输入是数据框/矩阵时:
use="complete.obs"执行列表删除(listwise deletion)——会删掉数据框中任意一个变量存在缺失值的行,仅用所有变量都无缺失的完整行,计算所有变量对的相关性。 - 当输入是两个单独向量时:
use="complete.obs"执行成对删除(pairwise deletion)——仅删除这两个向量中至少一个存在缺失值的行,只要这两个变量的值完整,就会被纳入计算,完全不考虑其他变量的缺失情况。
结合你的案例具体解释:
- 调用
cor(df[vars_num1], use="complete.obs")时,会过滤掉所有包含缺失值的行(比如某行serBilir有缺失,哪怕years和age都完整,也会被剔除),用剩余的"全变量完整"行计算相关性,样本量更小。 - 调用
cor(df$years, df$age, use="complete.obs")时,只要years和age的值完整,不管其他变量是否缺失,这些行都会被保留,样本量更大,因此相关性结果不同。
你可以用以下代码验证这个结论:
# 检查years和age本身的缺失情况 sum(is.na(df$years)) sum(is.na(df$age)) # 查看列表删除后的样本量(全变量无缺失的行数) nrow(na.omit(df[vars_num1])) # 查看成对删除后的样本量(仅years和age无缺失的行数) nrow(na.omit(data.frame(years=df$years, age=df$age)))
而你的自定义函数my_corr本质上仅基于years和age的完整观测计算,因此结果和cor(df$years, df$age, use="complete.obs")完全一致。
内容的提问来源于stack exchange,提问作者Hunter
相关产品推荐
相关产品推荐

