scale_y_log10() 影响 ggscatter 中的 p 值

Max*_*Max 1 r scatter-plot p-value

我正在使用 ggpubr 包中的 ggscatter 绘制两个连续变量之间的相关图。我使用的是肯德尔等级系数,p 值自动添加到图表中。我想使用scale_y_log10(),因为其中一个测量值存在很大的差异。然而,在代码中添加scale_y_log10()会影响p值。

样本数据:

sampledata <- structure(list(ID = c(1, 2, 3, 4, 5), Measure1 = c(10, 10, 50, 0, 100), Measure2 = c(5, 3, 40, 30, 20), timepoint = c(1, 1,1, 1, 1), time = structure(c(18628, 19205, 19236, 19205, 19205), class = "Date"), event = c(1, 1, NA, NA, NA), eventdate = structure(c(18779,19024, NA, NA, NA), class = "Date")), row.names = c(NA, -5L), class = "data.frame")
Run Code Online (Sandbox Code Playgroud)

没有scale_y_log10()的图

ggscatter(data = sampledata, x = "Measure2", y = "Measure1",
      add = "reg.line", conf.int = TRUE, 
      cor.coef = TRUE, cor.method = "kendall",
      xlab = "measure2", ylab = "measure1", color="#0073C2FF" ) 
Run Code Online (Sandbox Code Playgroud)

如您所见,R=0.11,P=0.8

添加scale_y_log10()时

ggscatter(data = sampledata, x = "Measure2", y = "Measure1",
      add = "reg.line", conf.int = TRUE, 
      cor.coef = TRUE, cor.method = "kendall",
      xlab = "measure2", ylab = "measure1", color="#0073C2FF" ) + scale_y_log10()
Run Code Online (Sandbox Code Playgroud)

R=0.55,P=0.28。

这只是一些示例数据,而不是我的实际数据。

谁能帮我解决这个问题吗?

All*_*ron 5

p 值发生变化的原因是您的 y 值之一(变量中Measure2为 0)。当您执行对数变换时,该 0 值变为负无穷大。它无法显示在绘图上,因此会从绘图数据中删除。如果您在没有此数据点的情况下运行ggscatter,您将看到获得与使用对数转换时相同的值:

ggscatter(data = subset(sampledata, Measure1 > 0),
          x = "Measure2", y = "Measure1",
          add = "reg.line", conf.int = TRUE,
          cor.coef = TRUE, cor.method = "kendall",
          xlab = "measure2", ylab = "measure1", color="#0073C2FF" )

Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

您还可以看到置信区间的 y 值延伸到 0 以下,因此对数变换图中的置信区间与未变换图中的置信区间不同 - 该geom_smooth图层基本上是在对数转换的数据,这可能不是您想要的。

与许多使创建简单绘图变得更容易的 ggplot 扩展一样,人们发现如果您想做一些不寻常的事情(例如在添加对数刻度时排除 0 或负值),则无法在该框架内做到这一点,因此您需要去回到香草 ggplot 来实现你想要的。

例如,您可以创建点、线和带,但排除 0 或负值,如下所示:

mod <- lm(Measure1 ~ Measure2, data = sampledata)

xvals <- seq(3, 40, length.out = 100)
xvals <- c(xvals, rev(xvals))
preds <- predict(mod, newdata = data.frame(Measure2 = xvals), se.fit = TRUE)
lower <- preds$fit - 1.96 * preds$se.fit
upper <- preds$fit + 1.96 * preds$se.fit
lower[lower < 1] <- 1

pred_df <- data.frame(Measure2 = xvals,
                      Measure1 = preds$fit)

polygon <- data.frame(Measure2 = xvals, 
                      Measure1 = c(lower[1:100], upper[101:200]))

ct <- cor.test(sampledata$Measure2, sampledata$Measure1, method = "kendall")
Run Code Online (Sandbox Code Playgroud)

现在我们可以安全地绘制数据并将其样式设置为看起来像 ggscatter:

p <- ggplot(subset(sampledata, Measure1 > 0),
       aes(Measure2, Measure1)) +
  geom_polygon(data = polygon, fill = "#0073c2", alpha = 0.5) +
  geom_point(color = "#0073c2", size = 2) +
  geom_line(data = pred_df, color = "#0073c2", size = 1) +
  annotate("text", hjust = 0, x = min(sampledata$Measure2), y = 50, size = 5,
           label = paste0("R = ", sprintf("%1.2f", ct$estimate), ", p = ",
                          sprintf("%1.2f", ct$p.value))) +
  theme_classic(base_size = 16)

p
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

但现在我们可以安全地记录转换输出:

p + scale_y_log10(limits = c(1, 1000))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述