[英]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有所突破。什么是最好的策略?
我將創建x
和factor
組合的擴展,然后對組合和數據進行類似數據庫的聯接。 例如,首先我用x
和factor
的唯一值的組合形成一個新的數據幀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.