Ich versuche, mithilfe von R einen Spline für eine GLM anzupassen. Sobald ich den Spline angepasst habe, möchte ich in der Lage sein, mein resultierendes Modell zu nehmen und eine Modellierungsdatei in einer Excel-Arbeitsmappe zu erstellen.
Angenommen, ich habe eine Datenmenge, in der y eine Zufallsfunktion von x ist und die Steigung sich an einem bestimmten Punkt abrupt ändert (in diesem Fall @ 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)
Ich passe das jetzt mit an
library(splines)
spline1 <- glm(y~ns(x,knots=c(500)),data=df,family=Gamma(link="log"))
und meine Ergebnisse zeigen
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
Zu diesem Zeitpunkt kann ich die Vorhersagefunktion in r verwenden und absolut akzeptable Antworten erhalten. Das Problem ist, dass ich die Modellergebnisse verwenden möchte, um eine Arbeitsmappe in Excel zu erstellen.
Mein Verständnis der Vorhersagefunktion ist, dass r bei einem neuen "x" -Wert dieses neue x in die entsprechende Spline-Funktion (entweder die Funktion für Werte über 500 oder die für Werte unter 500) einfügt, dieses Ergebnis dann aufnimmt und multipliziert Es wird mit dem entsprechenden Koeffizienten behandelt und von diesem Punkt an wie jeder andere Modellbegriff. Wie bekomme ich diese Spline-Funktionen?
(Hinweis: Ich stelle fest, dass ein log-verknüpftes Gamma-GLM möglicherweise nicht für den bereitgestellten Datensatz geeignet ist. Ich frage nicht, wie oder wann GLMs angepasst werden sollen. Ich stelle diesen Satz als Beispiel für Reproduzierbarkeitszwecke bereit.)
rm(list=ls())
) löscht , insbesondere nicht ohne Vorwarnung. Jemand kann Ihren Code in eine offene Sitzung von R copy-paste , wo sie einige Variablen haben bereits (aber keine genanntx
,y
,df
oderspline1
) und vermisst , dass Ihr Code tilgt ihre Arbeit. Ist es ein bisschen dumm für sie, das zu tun? Ja. Trotzdem ist es höflich, sie entscheiden zu lassen, wann sie ihre eigenen Variablen löschen.Antworten:
Sie können die Spline-Formeln rückentwickeln, ohne in den
R
Code einsteigen zu müssen. Es genügt zu wissen, dassEin Spline ist eine stückweise Polynomfunktion.
Polynome vom Grad werden durch ihre Werte bei d + 1 Punkten bestimmt.d d+ 1
Die Koeffizienten eines Polynoms können durch lineare Regression erhalten werden.
R
R
Diese Methode funktioniert mit jeder statistischen Software, auch mit undokumentierter proprietärer Software, deren Quellcode nicht verfügbar ist.
R
R
(Die vertikalen grauen Gitterlinien in der
R
Version zeigen, wo sich die inneren Knoten befinden.)Hier ist der vollständige
R
Code. Es ist ein ungekünstelter Hack, der sich ausschließlich auf diepaste
Funktion verlässt , um die String-Manipulation durchzuführen. (Besser wäre es, eine Formelvorlage zu erstellen und diese mit den Befehlen für String-Matching und -Substitution auszufüllen.)Die erste Spline-Ausgabeformel (von den vier hier erzeugten) lautet
R
quelle
ns.formula
.. denkst du in R ?! Im Ernst, obwohl Ihre Methode sehr nützlich aussieht, scheint es ironisch, einen Hack zu haben, um diese Parameter zu erhalten. Wäre sehr nützlich, um eine Tabelle auszugeben ..Sie haben bereits Folgendes getan:
Jetzt zeige ich Ihnen, wie Sie die Antwort für x = 12 auf zwei verschiedene Arten vorhersagen können: Verwenden Sie zuerst die Vorhersagefunktion (die einfache Methode!).
Der 2. Weg basiert direkt auf der Modellmatrix. Hinweis Ich habe verwendet,
exp
da die verwendete Link-Funktion log ist.Beachten Sie, dass ich oben das 12. Element extrahiert habe, da dies x = 12 entspricht. Wenn Sie für ein x außerhalb des Trainingssatzes vorhersagen möchten, können Sie einfach wieder die Vorhersagefunktion verwenden. Nehmen wir an, wir wollen dann den vorhergesagten Antwortwert für x = 1100 finden
quelle
Mit dem R-
rms
Paket ist es möglicherweise einfacher, die abgeschnittene Leistungsbasis für kubische Regressionssplines zu verwenden . Sobald Sie das Modell angepasst haben, können Sie die algebraische Darstellung der angepassten Spline-Funktion mit den FunktionenFunction
oderlatex
in abrufenrms
.quelle
Function()
sagt nicht wirklich, was es tut. In meinem Fall (siehe Details unter Rpubs rpubs.com/EmilOWK/rms_splines ) erhalte ich den Wertfunction(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>
Der-2863.7787
Wert ist der erste Coef im Modell,245.72672
der zweite und der letzte Coef-873.0223
ist in der Gleichung nirgendwo zu sehen. Gleiches gilt für die Ausgabe vonlatex()
.Function
funktioniert mit,Glm()
wenn Siercs
als Spline-Funktion verwenden. Bei der Ausgabe wird der Spline in einfachster Form umformuliert, indem geschrieben wird, als ob die in meinen RMS- Kursnotizen aufgeführten Einschränkungen für das lineare Ende nicht vorhanden wären (aber vorhanden sind) .