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。
这只是一些示例数据,而不是我的实际数据。
谁能帮我解决这个问题吗?
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)