在下面的工作示例中,即使設(shè)置fullrange參數(shù)TRUE,平滑線也會(huì)限制自己,并且我得到缺失值警告(這在我們?cè)诿總€(gè)geom_smooth()函數(shù)中本地設(shè)置新數(shù)據(jù)范圍時(shí)確實(shí)有意義)。
# convert time series to data.frame, conserving date info
sb <- data.frame(Seatbelts, date = time(Seatbelts))
# convert from ts to date
library(lubridate)
sb$date <- as_date(date_decimal(as.numeric(sb$date)))
# store seatbelt law date
law <- ymd(19830131)
# plot
library(ggplot2)
ggplot(sb) + aes(x = date, y = front) +
geom_line() +
geom_vline(xintercept = law, colour = "red") +
geom_smooth(data = sb[sb$date < law,],
fullrange = TRUE) +
geom_smooth(data = sb[sb$date > law,],
fullrange = TRUE)
當(dāng)前結(jié)果:平滑線條不會(huì)跨越整個(gè)范圍
警告信息:
Warning messages:
1: Removed 10 rows containing missing values (geom_smooth).
2: Removed 71 rows containing missing values (geom_smooth).
(目前使用ggplot2 3.1.0和R 3.5.2)
編輯:因?yàn)槲艺J(rèn)為問題是數(shù)據(jù)的初步子集,我也試過這個(gè)更干凈的版本,但無濟(jì)于事:
# add before/after
sb$relative <- ifelse(sb$date < law, "before", "after")
# plot v.2
ggplot(sb) + aes(x = date, y = front) +
geom_line() +
geom_vline(xintercept = law, colour = "red") +
geom_smooth(aes(colour = relative),
fullrange = TRUE)
解決辦法:默認(rèn)情況下
dates <- seq(as.Date("1960-01-01"), law, by = "1 day")
head(setNames(predict(
loess(front ~ as.numeric(date), data = sb[sb$date < law, ]),
data.frame(date = as.numeric(dates))), dates))
1960-01-01 1960-01-02 1960-01-03 1960-01-04 1960-01-05 1960-01-06
NA NA NA NA NA NA
其行為在?predict.loess(粗面礦)中解釋
當(dāng)使用'surface =“interpolate”'(默認(rèn)值)進(jìn)行擬合時(shí),'predict.loess'將不會(huì)外推 - 因此封閉原始數(shù)據(jù)的軸對(duì)齊超立方體外 的點(diǎn)將具有 缺失('NA')預(yù)測(cè)和標(biāo)準(zhǔn)錯(cuò)誤。
因此,為了推斷出用于LOESS模型的點(diǎn)范圍之外的點(diǎn),我們可以control = loess.control(surface = "direct")在內(nèi)部使用loess。
不幸的是,這意味著我們需要手動(dòng)執(zhí)行兩個(gè)LOESS擬合,預(yù)測(cè)兩個(gè)感興趣區(qū)域的值,并繪制所有內(nèi)容。








暫無數(shù)據(jù)