带缺失值的散点图矩阵相关性(R值)计算问题求助
问题
我想制作一个散点图矩阵,要求上方面板显示散点、下方面板显示相关系数R或R²值。无缺失值时代码运行正常,但存在缺失值时,即便尝试了缺失值处理代码(已注释),仍无法计算R值。我不想因单个缺失值删除整行数据(真实数据集较小),作为R语言新手,希望得到简单易懂的解决方案。
解决方案
问题出在相关系数计算时的缺失值处理逻辑错误,只需调整cor()函数的参数即可解决:
- 使用
cor(x, y, use = "pairwise.complete.obs"),该参数会针对每一对变量,只保留两者都无缺失值的观测来计算相关系数,不会删除整行数据,完美适配小数据集的需求。 - 之前尝试的
na.omit(x, y)写法错误,na.omit()需要传入数据框而非单独的向量,正确写法应为cor(na.omit(data.frame(x,y))),但用use参数更简洁直观。
另外,上方面板的散点图上方的R值计算也需要同步添加缺失值处理,否则有缺失值的散点图上方会显示NA。
修改后的完整代码
# -------------------------------------- # 创建数据集,含缺失值和无缺失值两个版本 # -------------------------------------- Alx <- c(13, 9, 5, 17, 2, 8, 11, 4) Bex <- c(23, 41, 32, 58, 26, 33, 51, 46) Dex <- c(7,10,6,4,19,6,15,16) Gax <- c(43,54,31,28,60,30,43,21) AlxM <- c(NA, 9, 5, 17, 2, 8, 11, 4) BexM <- c(23, 41, NA, 58, 26, 33, 51, 46) DexM <- c(7,10,6,4,19,6,15,NA) GaxM <- c(43,54,31,28,60,30,43,21) df <- data.frame(Alx,Bex,Dex,Gax) # 无缺失值的数据集 df_miss <- data.frame(AlxM,BexM,DexM,GaxM)# 含缺失值的数据集 rm(Alx,Bex,Dex,Gax,AlxM,BexM,DexM,GaxM) # 清理临时变量 # -------------------------------------- # -------------------------------------- # 散点图矩阵的上下面板函数 # -------------------------------------- # 上方面板:显示散点和R值 upper.panel<-function(x, y){ points(x,y, pch=19) # 添加缺失值处理参数 r <- round(cor(x,y, use = "pairwise.complete.obs"), digits=2) txt <- paste0("R = ", r) usr <- par("usr"); on.exit(par(usr)) par(usr = c(0, 1, 0, 1)) text(0.5, 0.9, txt) } # 下方面板:显示相关系数R值 panel.cor <- function(x, y){ usr <- par("usr"); on.exit(par(usr)) par(usr = c(0, 1, 0, 1)) # 添加缺失值处理参数 r <- round(cor(x, y, use = "pairwise.complete.obs"), digits=2) txt <- paste0("R = ", r) cex.cor <- 0.8/strwidth(txt) text(0.5, 0.5, txt, cex = 0.5) } # 绘制无缺失值的散点图矩阵 pairs(df[,1:4], lower.panel = panel.cor, upper.panel = upper.panel) # 绘制含缺失值的散点图矩阵 pairs(df_miss[,1:4], lower.panel = panel.cor, upper.panel = upper.panel) # --------------------------------------
内容的提问来源于stack exchange,提问作者Steve T
相关产品推荐
相关产品推荐

