Usiłuję dopasować splajn dla GLM za pomocą R. Po dopasowaniu splajnu chcę móc wziąć wynikowy model i utworzyć plik modelowania w skoroszycie programu Excel.
Załóżmy na przykład, że mam zestaw danych, w którym y jest losową funkcją x, a nachylenie zmienia się nagle w określonym punkcie (w tym przypadku @ x = 500).
set.seed(1066)
x<- 1:1000
y<- rep(0,1000)
y[1:500]<- pmax(x[1:500]+(runif(500)-.5)*67*500/pmax(x[1:500],100),0.01)
y[501:1000]<-500+x[501:1000]^1.05*(runif(500)-.5)/7.5
df<-as.data.frame(cbind(x,y))
plot(df)
Teraz dopasowuję to za pomocą
library(splines)
spline1 <- glm(y~ns(x,knots=c(500)),data=df,family=Gamma(link="log"))
i moje wyniki pokazują
summary(spline1)
Call:
glm(formula = y ~ ns(x, knots = c(500)), family = Gamma(link = "log"),
data = df)
Deviance Residuals:
Min 1Q Median 3Q Max
-4.0849 -0.1124 -0.0111 0.0988 1.1346
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 4.17460 0.02994 139.43 <2e-16 ***
ns(x, knots = c(500))1 3.83042 0.06700 57.17 <2e-16 ***
ns(x, knots = c(500))2 0.71388 0.03644 19.59 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
(Dispersion parameter for Gamma family taken to be 0.1108924)
Null deviance: 916.12 on 999 degrees of freedom
Residual deviance: 621.29 on 997 degrees of freedom
AIC: 13423
Number of Fisher Scoring iterations: 9
W tym momencie mogę użyć funkcji przewidywania w obrębie r i uzyskać całkowicie akceptowalne odpowiedzi. Problem polega na tym, że chcę użyć wyników modelu do zbudowania skoroszytu w programie Excel.
Rozumiem, że funkcja przewidywania jest taka, że biorąc pod uwagę nową wartość „x”, r wstawia tę nową x do odpowiedniej funkcji splajnu (funkcja dla wartości powyżej 500 lub funkcja dla wartości poniżej 500), a następnie bierze ten wynik i mnoży według odpowiedniego współczynnika i od tego momentu traktuje go jak każdy inny termin modelowy. Jak uzyskać te funkcje splajnu?
(Uwaga: zdaję sobie sprawę, że logm GLM połączony z logiem może nie być odpowiedni dla dostarczonego zestawu danych. Nie pytam o to, jak i kiedy pasować do GLM. Podam ten zestaw jako przykład do celów odtwarzalności).
rm(list=ls())
), szczególnie nie bez ostrzeżenia. Ktoś może skopiować i wkleić kod do otwartej sesji R, gdzie mają już pewne zmienne (ale żaden zwanex
,y
,df
lubspline1
) i miss, że kod wyciera swoją pracę. Czy jest to dla nich trochę głupie? Tak. Ale nadal uprzejmie jest pozwolić im zdecydować, kiedy usunąć własne zmienne.Odpowiedzi:
Możesz poddać inżynierii wstecznej formuły splajnu bez konieczności wchodzenia w
R
kod. Wystarczy to wiedziećSplajn jest fragmentaryczną funkcją wielomianową.
Wielomiany stopnia są określone przez ich wartości w punkcie .d + 1re re+ 1
Współczynniki wielomianu można uzyskać za pomocą regresji liniowej.
Dlatego musisz tylko utworzyć punkty między każdą parą kolejnych węzłów (w tym niejawne punkty końcowe zakresu danych), przewidzieć wartości splajnu i zresetować przewidywanie względem potęg od do . W każdym takim „bin” węzła będzie osobna formuła dla każdego elementu bazowego splajnu. Na przykład w poniższym przykładzie występują trzy węzły wewnętrzne (dla czterech przedziałów węzłów) i zastosowano splajny sześcienne ( ), co daje wielomianów sześciennych, każdy o współczynniku . Ponieważ stosunkowo wysokie mocex x d d = 3 4 × 4 = 16 d + 1 = 4 xre+ 1 x xre re= 3 4 × 4 = 16 re+ 1 = 4 x są zaangażowane, konieczne jest zachowanie całej precyzji współczynników. Jak można sobie wyobrazić, pełna formuła dla dowolnego elementu bazowego splajnu może trwać dość długo!
Jak wspomniałem już jakiś czas temu , umiejętność korzystania z danych wyjściowych jednego programu jako danych wejściowych innego programu (bez interwencji ręcznej, która może wprowadzić nieodwracalne błędy) jest przydatną umiejętnością komunikacji statystycznej. To pytanie stanowi dobry przykład zastosowania tej zasady: zamiast ręcznego kopiowania tych szesnastocyfrowych współczynników, możemy zhakować razem sposób konwersji splajnów obliczonych przez na formuły zrozumiałe dla Excela. Wszystko, co musimy zrobić, to wyodrębnić współczynniki splajnu z powyższego opisu, sformatować je do formuł podobnych do Excela, a także skopiować i wkleić je do Excela.64
R
R
Ta metoda będzie działać z dowolnym oprogramowaniem statystycznym, nawet nieudokumentowanym oprogramowaniem prawnie zastrzeżonym, którego kod źródłowy jest niedostępny.
Oto przykład wzięty z pytania, ale zmodyfikowany tak, aby zawierał węzły w trzech punktach wewnętrznych ( ), a także w punktach końcowych . Wykresy pokazują wersję, a następnie renderowanie w programie Excel. Bardzo niewiele dostosowań przeprowadzono w obu środowiskach (poza określaniem kolorów w przybliżeniu, aby pasowały do domyślnych kolorów Excela).( 1 , 1000 )200 , 500 , 800 ( 1 , 1000 )
R
R
(Pionowe szare linie siatki w
R
wersji pokazują, gdzie znajdują się wewnętrzne węzły.)Oto pełny
R
kod. Jest to niewyszukany hack, polegający całkowicie napaste
funkcji umożliwiającej manipulację ciągiem. (Lepszym sposobem byłoby utworzenie szablonu formuły i wypełnienie go za pomocą poleceń dopasowywania i zastępowania ciągów).Pierwsza formuła wyjściowa splajnu (spośród czterech tu wytworzonych) to
Aby działało to w programie Excel, wystarczy usunąć otaczające znaki cudzysłowu i poprzedzić je znakiem „=”. (Przy odrobinie wysiłku możeszx x
R
napisać plik, który po zaimportowaniu przez program Excel zawiera kopie tych formuł we wszystkich właściwych miejscach.) Wklej go do pola formuły, a następnie przeciągnij tę komórkę, aż „A1” odwołuje się do pierwszej wartość, gdzie ma być obliczony splajn. Skopiuj i wklej (lub przeciągnij i upuść) tę komórkę, aby obliczyć wartości dla innych komórek. Wypełniłem komórki B2: E: 102 tymi wzorami, odnosząc się do wartości w komórkach A2: A102.źródło
ns.formula
.. czy myślisz w R ?! Poważnie, choć twoja metoda wygląda bardzo przydatna, ale ironiczne wydaje się zhackowanie hacka, aby uzyskać te parametry. Byłoby bardzo przydatne, abyWykonałeś już następujące czynności:
Teraz pokażę ci, jak przewidywać (odpowiedź) dla x = 12 na dwa różne sposoby: Najpierw użyj funkcji przewidywania (prosty sposób!)
Drugi sposób oparty jest bezpośrednio na macierzy modelu. Uwaga Użyłem,
exp
ponieważ użytą funkcją link jest log.Zauważ, że powyżej wyodrębniłem 12. element, ponieważ odpowiada to x = 12. Jeśli chcesz przewidzieć x poza zestawem treningowym, możesz po prostu ponownie użyć funkcji przewidywania. Powiedzmy, że chcemy znaleźć przewidywaną wartość odpowiedzi dla x = 1100
źródło
Łatwiejsze może być użycie skróconej podstawy mocy dla splajnów regresji sześciennej za pomocą
rms
pakietu R. Po dopasowaniu modelu można uzyskać reprezentację algebraiczną dopasowanej funkcji splajnu za pomocą funkcjiFunction
lublatex
wrms
.źródło
Function()
naprawdę nie mówi, co robi. W moim przypadku (szczegóły na Rpubs rpubs.com/EmilOWK/rms_splines ), dostaję wartość jest pierwszym COEF w modelu, w drugim, a ostatni COEF nie widać nigdzie w równaniu. To samo dotyczy wyników .function(x = NA) {-2863.7787+245.72672* x-0.1391794*pmax(x-10.9,0)^3+0.27835881*pmax(x-50.5,0)^3-0.1391794*pmax(x-90.1,0)^3 } <environment: 0x556156e80db8>
-2863.7787
245.72672
-873.0223
latex()
Function
działa,Glm()
gdy używaszrcs
jako funkcji splajnu. Wyjście przeformułowuje splajn w najprostszej formie, pisząc tak, jakby liniowe ograniczenia ogona nie były (ale są), jak wyszczególniono w notatkach z kursu RMS .