簡體   English   中英

如何為“缺失”值(R,ggplot)創建更平滑的間隙

[英]How create gaps in smoother for “missing” values (R, ggplot)

如果我有這樣的數據集

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有所突破。什么是最好的策略?

我將創建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))

這使:

在此處輸入圖片說明

由於您提供的樣本數據的分辨率非常低,並且因為我使用的這種方法僅預測觀察到的數據,並且保留了NA ,所以它看起來有點時髦。 geom_smooth()實際上是分別針對每個組在x的范圍內進行預測,因此在用於繪制geom圖層的數據中沒有丟失x s。

除非您能解釋在x = 3哪個區域內,我們應該添加一個間隔( NA ),否則這可能是您可以做的最好的選擇。 或者,我們可以根據模型預測整個區域,然后將2.5 < x < 3.5設置為NA 如果這是您想要的,請添加一條評論, 如果您可以指出我們如何設想差距,我將舉一個例子進行擴展。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM