Mam pewne dane, które chciałbym wygładzić, aby wygładzone punkty monotonicznie zmniejszały się. Moje dane gwałtownie spadają, a następnie zaczynają się wyrównywać. Oto przykład z użyciem R.
df <- data.frame(x=1:10, y=c(100,41,22,10,6,7,2,1,3,1))
ggplot(df, aes(x=x, y=y))+geom_line()
Jakiej dobrej techniki wygładzania mógłbym użyć? Byłoby również miło, gdybym mógł zmusić pierwszy wygładzony punkt do zbliżenia się do mojego obserwowanego punktu.
plot(y~x,data=df); f=fitted( glm( y~ns(x,df=4), data=df,family=quasipoisson)); lines(df$x,f)
Odpowiedzi:
Można to zrobić za pomocą splajnowanych splajnów z ograniczeniami monotoniczności za pośrednictwem funkcji
mono.con()
ipcls()
w pakiecie mgcv . Jest trochę do zrobienia, ponieważ te funkcje nie są tak przyjazne dla użytkownikagam()
, ale kroki pokazano poniżej, oparte głównie na przykładzie z?pcls
, zmodyfikowane, aby pasowały do podanych przez Ciebie danych przykładowych:Teraz musimy wypełnić obiekt, który przechodzi do
pcls()
zawierającego szczegółowe informacje o ograniczonym modelu ograniczonym, który chcemy dopasowaćTeraz możemy w końcu dokonać dopasowania
p
zawiera wektor współczynników dla funkcji bazowych odpowiadających splajnowi. Aby zwizualizować dopasowany splajn, możemy przewidzieć na podstawie modelu w 100 lokalizacjach w zakresie x. Robimy 100 wartości, aby uzyskać ładną, gładką linię na wykresie.Do generowania przewidywanych wartości używamy
Predict.matrix()
macierzy, która po pomnożeniu przez współczynnikip
daje przewidywane wartości z dopasowanego modelu:Daje to:
Od ciebie zależy, czy dane zostaną uporządkowane w celu drukowania w ggplot ...
Możesz wymusić ściślejsze dopasowanie (aby częściowo odpowiedzieć na pytanie o płynniejsze dopasowanie pierwszego punktu danych) poprzez zwiększenie wymiaru funkcji podstawowej
x
. Na przykład ustawieniek
równości8
(k <- 8
) i ponowne uruchomienie kodu powyżej otrzymujemyNie można
k
znacznie zwiększyć tych danych i trzeba uważać, aby nie dopasować; wszystko, copcls()
robisz, to rozwiązanie problemu najmniejszych kwadratów podlegających karze, biorąc pod uwagę ograniczenia i dostarczone funkcje podstawowe, nie wykonuje dla ciebie wyboru gładkości - nie, że wiem o ...)Jeśli chcesz interpolacji, zobacz podstawową funkcję R,
?splinefun
która ma splajny Hermite i splajny sześcienne z ograniczeniami monotoniczności. W takim przypadku nie można tego jednak użyć, ponieważ dane nie są ściśle monotoniczne.źródło
splinefun
była moja pierwsza myśl, jak również (jestem interpolację), alespline(x=df$x, y=df$y, n=nrow(df), method="monoH.FC")
ispline(x=df$x, y=df$y, n=nrow(df), method="hyman")
oba błędy raise?mono.con
zawiera dalsze szczegóły dotyczące metody.splinefun
podnosi błąd; Właśnie sobie uświadomiłem, że możesz dopasować monotoniczny splajn, który interpoluje dane, które same w sobie nie są monotoniczne. Obserwacja wx = 6
jest większay
niż obserwacje wx = 5
. Musisz tylko zignorować tę część odpowiedzi :-)mono.con
powracają do splajnu sześciennego.?pcls
zawiera przykłady cienkich wypustów płytowych i modeli addytywnych, które są mniej przyjazne dla użytkownika niż powyższe, ale które mogą ujawnić nieco więcej matematyki, jeśli znasz matematykę dla tych rodzajów splajnu (sam nie jestem taki zaznajomiony).Niedawny pakiet oszustwa autorstwa Natalii Pya i oparty na pracy Pya & Wood (2015) „Modele z ograniczeniami kształtu” autorstwa Pya & Wood (2015) mogą znacznie ułatwić proces wspomniany w doskonałej odpowiedzi Gavina.
Istnieje wiele funkcji bs, których możesz użyć - powyżej użyłem mpd do „monotonicznego zmniejszania splajnu P”, ale ma także funkcje, które wymuszają wypukłość lub wklęsłość osobno lub równolegle z ograniczeniami monotonicznymi.
źródło