Musiałam wziąć głęboki nur do github
repo ale w końcu dostał. Aby to zrobić, musisz wiedzieć, jak działa stat_smooth
. W tym konkretnym przypadku funkcja loess
nazywa wykonać wygładzanie (różne funkcje wygładzania może być wykonana przy użyciu tego samego procesu, jak poniżej):
Więc korzystając loess
przy tej okazji chcielibyśmy zrobić:
#data
df <- mtcars[,c("mpg","cyl"), with=FALSE]
#run loess model
cars.lo <- loess(cyl ~ mpg, df)
Następnie musiałem przeczytać this, aby zobaczyć, jak przewidywania są dokonywane wewnętrznie w stat_smooth
. Widocznie Hadley wykorzystuje funkcję predictdf
(co nie jest eksportowany do przestrzeni nazw) w następujący sposób dla naszego przypadku:
predictdf.loess <- function(model, xseq, se, level) {
pred <- stats::predict(model, newdata = data.frame(x = xseq), se = se)
if (se) {
y = pred$fit
ci <- pred$se.fit * stats::qt(level/2 + .5, pred$df)
ymin = y - ci
ymax = y + ci
data.frame(x = xseq, y, ymin, ymax, se = pred$se.fit)
} else {
data.frame(x = xseq, y = as.vector(pred))
}
}
Po przeczytaniu powyższego udało mi się stworzyć własną data.frame z przewidywaniami, używając:
#get the predictions i.e. the fit and se.fit vectors
pred <- predict(cars.lo, se=TRUE)
#create a data.frame from those
df2 <- data.frame(mpg=df$mpg, fit=pred$fit, se.fit=pred$se.fit * qt(0.95/2 + .5, pred$df))
Patrząc na predictdf.loess
widzimy, że górna granica przedziału ufności jest tworzony jako pred$fit + pred$se.fit * qt(0.95/2 + .5, pred$df)
a dolna granica jako pred$fit - pred$se.fit * qt(0.95/2 + .5, pred$df)
.
Używanie tych możemy stworzyć flagę punktów powyżej lub poniżej tych granic:
#make the flag
outerpoints <- +(df$cyl > df2$fit + df2$se.fit | df$cyl < df2$fit - df2$se.fit)
#add flag to original data frame
df$outer <- outerpoints
Kolumna df$outer
jest chyba to, co PO szuka (to przyjmuje wartość 1, jeśli jest poza granice lub 0 inaczej), ale tylko ze względu na to spiskuję go poniżej.
Zauważ, że powyższa funkcja +
służy tylko do przekształcenia flagi logicznej w numeryczną.
Teraz jeśli wykreślić jako to:
ggplot(df,aes(mpg,cyl)) +
geom_point(aes(colour=factor(outer))) +
geom_smooth()
Możemy faktycznie patrz punkty wewnątrz i na zewnątrz przedziału ufności.
wyjściowa:
PS:Dla każdego, kto jest zainteresowany w górnych i dolnych granic, są one tworzone tak (spekulacji: chociaż zacienione obszary są prawdopodobnie utworzone z geom_ribbon - lub coś podobnego - co czyni je bardziej okrągłe i ładny):
#upper boundary
ggplot(df,aes(mpg,cyl)) +
geom_point(aes(colour=factor(outer))) +
geom_smooth() +
geom_line(data=df2, aes(mpg , fit + se.fit , group=1), colour='red')
#lower boundary
ggplot(df,aes(mpg,cyl)) +
geom_point(aes(colour=factor(outer))) +
geom_smooth() +
geom_line(data=df2, aes(mpg , fit - se.fit , group=1), colour='red')
można uruchomić poprzez włączenie kodu i danych. – nrussell
'ident (x, y ...)' ale część twoich danych jest potrzebna – Mateusz1981
Należy zauważyć, że linie przedziału ufności są przedziałem ufności dla średniej danych, a nie dla samych danych. A ponieważ masz tak dużo danych, spodziewam się, że większość wartości będzie poza przedziałem. – bramtayl