R中散点图去x=0/y=0值及线性检验相关技术咨询
关于ggpairs散点图0值处理与Pearson相关系数计算的问题解答
问题背景
我需要对多组变量对进行线性检验,目前用ggpairs(data)实现,但很多变量存在x=0和y=0的取值,散点图形态受影响,难以判断正相关性。现提出两个问题:
- 进行线性检验和计算Pearson相关系数时,是否需要移除这些x=0和y=0的点?
- 若需移除,如何仅在对应散点图中删除这些点,而不删除整行数据或影响其他散点图?
示例数据集(变量代表各领域工作年限):
structure(list(ID = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), D_biologie = c(0, 1, 5, 2, 3, 12, 0, 4, 0, 0), D_chimie = c(2, 9, 0, 4, 0, 40, 0, 6, 9, 0), D_math = c(5, 2, 0, 6, 0, 30, 10, 7, 0, 50), D_physic = c(12, 3, 5, 7, 12, 5, 0, 9, 40, 6), D_french = c(40, 4, 35, 9, 40, 0, 4, 4, 5, 7), D_eng = c(30, 0, 0, 10, 30, 4, 2, 0, 0, 50), D_hist = c(5, 6, 0, 4, 5, 0, 6, 7, 0, 0), D_geo = c(0, 8, 2, 0, 0, 0, 9, 1, 0, 0)), class = c("tbl_df", "tbl", "data.frame" ), row.names = c(NA, -10L))
问题1:是否需要移除x=0和y=0的点?
这完全取决于你的研究假设和变量定义:
- 如果0代表「该领域无工作经验」,而你的研究目标是探究有该领域工作经验人群中,两个变量的线性相关性,那必须移除这些0值点——因为0值对应的样本不属于你要研究的群体,保留会稀释甚至扭曲真实的相关性。
- 如果你的研究需要覆盖所有样本(包括无经验者),那不能移除,但此时要注意:Pearson相关系数要求变量服从正态分布且存在线性关系,大量0值会破坏这些前提,建议改用Spearman秩相关,或者先分析0值的意义(是否为截断数据),再选择合适的统计方法。
简单说:先明确你要研究的群体是谁,再决定是否移除。
问题2:如何在ggpairs中仅对应散点图删除0值点?
可以通过自定义ggpairs的散点图绘制函数,在绘图时仅过滤当前变量对的0值,不修改原始数据集,也不影响其他子图(比如对角线上的直方图、其他变量对的图)。
实现代码
library(GGally) library(tidyverse) # 加载示例数据 data <- structure(list(ID = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), D_biologie = c(0, 1, 5, 2, 3, 12, 0, 4, 0, 0), D_chimie = c(2, 9, 0, 4, 0, 40, 0, 6, 9, 0), D_math = c(5, 2, 0, 6, 0, 30, 10, 7, 0, 50), D_physic = c(12, 3, 5, 7, 12, 5, 0, 9, 40, 6), D_french = c(40, 4, 35, 9, 40, 0, 4, 4, 5, 7), D_eng = c(30, 0, 0, 10, 30, 4, 2, 0, 0, 50), D_hist = c(5, 6, 0, 4, 5, 0, 6, 7, 0, 0), D_geo = c(0, 8, 2, 0, 0, 0, 9, 1, 0, 0)), class = c("tbl_df", "tbl", "data.frame" ), row.names = c(NA, -10L)) # 自定义散点图函数:过滤当前x和y的0值 custom_scatter <- function(data, mapping, ...) { # 提取当前x和y变量名 x_var <- as_label(mapping$x) y_var <- as_label(mapping$y) # 过滤数据:仅保留x≠0且y≠0的行 filtered_data <- data %>% filter(!!sym(x_var) != 0, !!sym(y_var) != 0) # 绘制散点图,可选添加线性拟合线 ggplot(filtered_data, mapping) + geom_point(...) + geom_smooth(method = "lm", se = FALSE, color = "red") } # 生成ggpairs图:仅在散点图(上下三角)使用自定义函数 ggpairs(data, columns = 2:9, # 指定要分析的变量列(排除ID) upper = list(continuous = custom_scatter), lower = list(continuous = custom_scatter))
代码说明
custom_scatter函数会自动识别当前子图的x和y变量,仅过滤该变量对的0值,不影响其他子图的数据。- 对角线上的直方图/密度图仍会使用原始数据,不会被过滤。
- 如果只需要修改上三角或下三角的散点图,只需调整
upper或lower参数即可。
内容的提问来源于stack exchange,提问作者R_help
相关产品推荐
相关产品推荐

