r - 两条 geom_smooth() 线之间的差异

标签 r ggplot2 difference smoothing gam

我为我的数据绘制了一个图,现在我想知道由 geom_smooth() 估计的每个 x 的 y 差异。有一个similiar question不幸的是没有答案。例如,如何获取以下图的差异(数据如下):

plot

编辑

提出了两个建议,但我仍然不知道如何计算差异。

第一个建议是从 ggplot 对象访问数据。我这样做了

pb <- ggplot_build(p)
pb[["data"]][[1]]

这种方法确实有效,但数据对各组不使用相同的 x 值。例如,第一组的第一个 x 值为 -3.21318853,但第二组没有 -3.21318853 的 x,因此,我无法计算两组之间 -3.21318853 的 y 差异

第二个建议是看看 geom_smooth() 中使用了什么公式。软件包描述称“loess() 用于少于 1,000 个观测值;否则 mgcv::gam() 与公式 = y ~ s(x, bs = "cs") 一起使用”。我的N超过6万,所以默认使用gam。我对gam不熟悉; 任何人都可以提供一个简短的答案,如何计算两条线之间的差异考虑到刚刚描述的事情?

R代码

library("ggplot2") # library ggplot
set.seed(1) # make example reproducible
n <- 5000 # set sample size
df <- data.frame(x= rnorm(n), g= factor(rep(c(0,1), n/2))) # generate data
df$y <- NA # include y in df
df$y[df$g== 0] <- df$x[df$g== 0]**2 + rnorm(sum(df$g== 0))*5 # y for group g= 0
df$y[df$g== 1] <-2 + df$x[df$g== 1]**2 + rnorm(sum(df$g== 1))*5 # y for g= 1 (with intercept 2)
ggplot(df, aes(x, y, col= g)) + geom_smooth() + geom_point(alpha= .1) # make a plot

最佳答案

您好,欢迎来到 Stack Overflow,

第一个建议很好。要使 x 序列匹配,您可以使用 approx 在两者之间插入值。函数(在 stats 中)。

library("ggplot2") # library ggplot
set.seed(1) # make example reproducible
n <- 5000 # set sample size
df <- data.frame(x= rnorm(n), g= factor(rep(c(0,1), n/2))) # generate data
df$y <- NA # include y in df
df$y[df$g== 0] <- df$x[df$g== 0]**2 + rnorm(sum(df$g== 0))*5 # y for group g= 0
df$y[df$g== 1] <-2 + df$x[df$g== 1]**2 + rnorm(sum(df$g== 1))*5 # y for g= 1 (with intercept 2)

p <- ggplot(df, aes(x, y, col= g)) + geom_smooth() + geom_point(alpha= .1) # make a plot
pb <- ggplot_build(p) # Get computed data

data.of.g1 <- pb[['data']][[1]][pb[['data']][[1]]$group == 1, ] # Extract info for group 1
data.of.g2 <- pb[['data']][[1]][pb[['data']][[1]]$group == 2, ] # Extract info for group 2

xlimit.inf <- max(min(data.of.g1$x), min(data.of.g2$x)) # Get the minimum X the two smoothed data have in common
xlimit.sup <- min(max(data.of.g1$x), max(data.of.g2$x)) # Get the maximum X
xseq <- seq(xlimit.inf, xlimit.sup, 0.01) # Sequence of X value (you can use bigger/smaller step size)

# Based on data from group 1 and group 2, interpolates linearly for all the values in `xseq`
y.g1 <- approx(x = data.of.g1$x, y = data.of.g1$y, xout = xseq)
y.g2 <- approx(x = data.of.g2$x, y = data.of.g2$y, xout = xseq)

difference <- data.frame(x = xseq, dy = abs(y.g1$y - y.g2$y)) # Compute the difference
ggplot(difference, aes(x = x, y = dy)) + geom_line() # Make the plot

输出: Expected output

关于r - 两条 geom_smooth() 线之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56322590/

相关文章:

Android AsyncTask 和 Thread 不同的行为

r - ggplot 中的字体系列不会改变

r - 在 R 中向列表中添加元素的最快方法

r - 错误: package or namespace load failed for ‘raster’ in inDL(x, as.逻辑(本地),as.逻辑(现在),...):

r - 像 rworldmap 一样在 R 中创建 map ,但针对具有省份的特定国家/地区

c++ - C 和 C++ 中类的区别

python - torch.flatten() 和 nn.Flatten() 之间的区别

r - 进行这样的相关矩阵图的最佳方法是什么?

r - ggplot改变大小和颜色

R:向ggplot2添加水平线