You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R中散点图去x=0/y=0值及线性检验相关技术咨询

关于ggpairs散点图0值处理与Pearson相关系数计算的问题解答

问题背景

我需要对多组变量对进行线性检验,目前用ggpairs(data)实现,但很多变量存在x=0和y=0的取值,散点图形态受影响,难以判断正相关性。现提出两个问题:

  1. 进行线性检验和计算Pearson相关系数时,是否需要移除这些x=0和y=0的点?
  2. 若需移除,如何仅在对应散点图中删除这些点,而不删除整行数据或影响其他散点图?

示例数据集(变量代表各领域工作年限):

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 17:01:32