【问题标题】:How create gaps in smoother for "missing" values (R, ggplot)如何为“缺失”值创建更平滑的间隙(R,ggplot)
【发布时间】:2015-09-17 20:22:45
【问题描述】:

如果我有这样的数据集

set.seed(100)
data <- data.frame("x" = c(1, 1, 1, 2, 2, 2, 3, 4, 4, 4, 5, 5, 5),
                   "y" = rnorm(13),
                   "factor" = c("a","b","c","a","b", "c", "c", "a",
                                "b", "c", "a", "b","c"))

看起来像这样

   x           y factor
1  1 -0.50219235      a
2  1  0.13153117      b
3  1 -0.07891709      c
4  2  0.88678481      a
5  2  0.11697127      b
6  2  0.31863009      c
7  3 -0.58179068      c
8  4  0.71453271      a
9  4 -0.82525943      b
10 4 -0.35986213      c
11 5  0.08988614      a
12 5  0.09627446      b
13 5 -0.20163395      c

我想用一个单独的平滑器来绘制这个每个因子 (a,b,c)

library(ggplot2)
ggplot(data = data, aes(x = x, y = y, col = factor)) + 
  geom_smooth(aes(group = factor))

但是,由于 x = 3 的“a”和“b”没有值,所以我希望“a”和“b”的平滑器在 x = 3 时有一个休息。什么是最好的策略做到了吗?

【问题讨论】:

  • “休息一下”是什么意思?

标签: r ggplot2 smooth


【解决方案1】:

我将创建xfactor 组合的扩展,然后对组合和数据进行类似数据库的连接。例如,首先我用xfactor的唯一值组合形成一个新的数据框df

df <- expand.grid(sapply(data[, c("x", "factor")], unique))

> df
   x factor
1  1      a
2  2      a
3  3      a
4  4      a
5  5      a
6  1      b
7  2      b
8  3      b
9  4      b
10 5      b
11 1      c
12 2      c
13 3      c
14 4      c
15 5      c

然后我们可以简单地对df 和您的data 执行连接操作,要求我们从左侧返回所有行(x 参数,因此df),并包括相应的y 的值来自右侧 (data)。在没有对应右手边的地方(在data中,我们会得到一个NA

newdf <- merge(df, data, all.x = TRUE)

> newdf
   x factor           y
1  1      a -0.50219235
2  1      b  0.13153117
3  1      c -0.07891709
4  2      a  0.88678481
5  2      b  0.11697127
6  2      c  0.31863009
7  3      a          NA
8  3      b          NA
9  3      c -0.58179068
10 4      a  0.71453271
11 4      b -0.82525943
12 4      c -0.35986213
13 5      a  0.08988614
14 5      b  0.09627446
15 5      c -0.20163395

现在我们可以手动拟合和预测黄土模型,但这有点乏味 - 更简单的选项可通过 mgcv:gam() 获得

loessFun <- function(XX, span = 0.85) {
  fit <- loess(y ~ x, data = XX, na.action = na.exclude, span = span)
  predict(fit)
}

现在按factor 拆分数据并应用loessFun() 包装器

fits <- lapply(split(newdf, newdf$factor), loessFun)
newdf <- transform(newdf, fitted = unsplit(fits, factor))

> head(newdf)
  x factor           y      fitted
1 1      a -0.50219235 -0.50219235
2 1      b  0.13153117  0.13153117
3 1      c -0.07891709 -0.07891709
4 2      a  0.88678481  0.88678481
5 2      b  0.11697127  0.11697127
6 2      c  0.31863009  0.31863009

然后我们可以使用新的数据框进行绘图

ggplot(newdf, aes(x = x, y = y, col = factor)) + 
  geom_line(aes(group = factor))

给出:

由于您提供的样本数据的分辨率非常低,并且因为我使用的这种方法仅预测观察到的数据,它看起来有点时髦,保留NAs。 geom_smooth() 实际上是在 x 的范围内分别预测每个组,因此用于绘制 geom 层的数据中不会缺少 xs。

除非你能解释在x = 3 的哪个区域内我们应该添加一个中断(NA),否则这可能是你能做的最好的。或者,我们可以从模型中预测该区域,然后将任何 2.5 &lt; x &lt; 3.5 设置回 NA。如果这是您想要的,请添加评论,我将通过一个示例扩展我的答案如果您可以指出我们将如何设想差距。

【讨论】:

    猜你喜欢
    • 2021-02-06
    • 1970-01-01
    • 2013-04-28
    • 1970-01-01
    • 1970-01-01
    • 2021-07-06
    • 2018-10-08
    • 2021-01-14
    • 1970-01-01
    相关资源
    最近更新 更多