R中环境披露与行业二元虚拟变量相关性分析及cor()输出NA问题解决
为什么之前的cor()结果全是NA
之前把12个变量一起放进cor()计算全量相关矩阵,输出满屏NA是必然结果:
- 你手里的11个行业变量是严格互斥的——每个样本只能归属1个行业,任意两个行业变量不可能同时取1,这组变量本身存在完全线性依赖,对应的协方差矩阵是奇异的,R计算这类奇异矩阵时,会自动给涉及线性依赖的交叉位置标记NA
- 加上你根本不需要计算11个行业变量两两之间的相关性,全矩阵计算的冗余维度触发了异常;如果计算时没指定缺失值处理规则,只要配对样本里有缺失观测,也会直接返回NA
可直接落地的计算方案
你的所有变量都是0-1二元虚拟变量,用Pearson法算出来的相关系数本质就是适配两个二元分类变量的Phi系数,完全符合分析要求,不需要更换其他相关计算方法。
直接按下面的流程操作就能得到正确结果:
- 拆分核心变量和待配对的行业变量:假设数据集名为
df,环境披露变量列名为DISCL,先把所有行业变量的列名提取出来industry_cols <- setdiff(colnames(df), "DISCL") - 逐对计算
DISCL和每个行业变量的相关值,全程不进入全矩阵计算流程,绕开共线性带来的NA问题:# 逐列计算和DISCL的相关 cor_vals <- sapply(industry_cols, function(col) { cor( x = df$DISCL, y = df[[col]], use = "complete.obs", # 自动跳过配对的缺失值 method = "pearson" ) }) - 整理成规整的结果表直接输出:
output_table <- data.frame( 配对行业 = names(cor_vals), 与环境披露的相关系数 = round(as.numeric(cor_vals), 3) ) # 打印查看结果 output_table
结果异常的排查
如果某一个行业变量的配对结果还是返回NA,直接检查该列的取值分布:
- 要是该列在全样本里全是0或者全是1,变量自身方差为0,和任何其他变量的相关系数都没有统计意义,直接把这个列从计算列表里删掉就行
- 逐对计算的逻辑完全不受行业变量互斥的影响,不会像全矩阵计算那样因为共线性批量输出NA
内容的提问来源于stack exchange,提问作者David Perea
相关产品推荐
相关产品推荐

