Wie finde ich einen p-Wert für eine glatte Spline / Löss-Regression?


10

Ich habe einige Variablen und bin daran interessiert, nichtlineare Beziehungen zwischen ihnen zu finden. Also entschied ich mich für Spline oder Löss und druckte schöne Diagramme (siehe Code unten). Ich möchte aber auch einige Statistiken haben, die mir eine Vorstellung davon geben, wie wahrscheinlich es ist, dass die Beziehung zufällig ist ... dh ich benötige einen p-Gesamtwert, wie ich ihn zum Beispiel für die lineare Regression habe. Mit anderen Worten, ich muss wissen, ob die angepasste Kurve sinnvoll ist, da mein Code eine Kurve an alle Daten anpasst.

x <- rnorm(1000)
y <- sin(x) + rnorm(1000, 0, 0.5)

cor.test(x,y)
plot(x, y, xlab = xlab, ylab = ylab)
spl1 <- smooth.spline(x, y, tol = 1e-6, df = 8)
lines(spl1, col = "green", lwd = 2)

spl2 <- loess(y ~ x)
x.pr <- seq(min(x), max(x), length.out = 100)
lines(x.pr, predict(spl2, x.pr), col = "blue", lwd = 2)

Antworten:


8

Die Splines Bibliothek verfügt über Funktionen bsund nsdas wird Spline - Basis auf der Verwendung mit der erstellen lmFunktion, dann können Sie ein lineares Modell und ein Modell mit Splines passen und die Verwendung anovaFunktion den vollen und reduzierten Modell Test zu tun , wenn das Spline - Modell paßt wesentlich besser zu sehen als das lineare Modell.

Hier ist ein Beispielcode:

x <- rnorm(1000)
y <- sin(x) + rnorm(1000, 0, 0.5)

library(splines)

fit1 <- lm(y~x)
fit0 <- lm(y~1)
fit2 <- lm(y~bs(x,5))

anova(fit1,fit2)
anova(fit0,fit2)

plot(x,y, pch='.')
abline(fit1, col='red')
xx <- seq(min(x),max(x), length.out=250)
yy <- predict(fit2, data.frame(x=xx))
lines(xx,yy, col='blue')

Sie können die polyFunktion auch verwenden , um eine Polynomanpassung durchzuführen und die nichtlinearen Terme als Krümmungstest zu testen.

Für die Löss-Passform ist es etwas komplizierter. Es gibt einige Schätzungen äquivalenter Freiheitsgrade für den Lössglättungsparameter, die zusammen mit den -Werten für die zu konstruierenden linearen und Lössmodelle und den F-Test verwendet werden könnten . Ich denke, dass Methoden, die auf Bootstrapping- und Permutationstests basieren, intuitiver sein können.R2

Es gibt Techniken zum Berechnen und Zeichnen eines Konfidenzintervalls für eine Lössanpassung (ich glaube, das ggplot2-Paket enthält möglicherweise eine integrierte Methode). Sie können das Konfidenzband zeichnen und prüfen, ob eine gerade Linie in das Band passt (dies) ist kein p-Wert, gibt aber trotzdem ein Ja / Nein.

Sie könnten ein lineares Modell anpassen und die Residuen nehmen und ein Lössmodell als Antwort (und die interessierende Variable als Prädiktor) an die Residuen anpassen. Wenn das wahre Modell linear ist, sollte diese Anpassung nahe an einer flachen Linie liegen und die Punkte neu anordnen relativ zum Prädiktor sollte keinen Unterschied machen. Damit können Sie einen Permutationstest erstellen. Passen Sie den Löss an, finden Sie den vorhergesagten Wert, der am weitesten von 0 entfernt ist, permutieren Sie nun zufällig die Punkte und passen Sie einen neuen Löss an und finden Sie den am weitesten vorhergesagten Punkt von 0, wiederholen Sie einige Male, der p-Wert ist der Anteil der permutierten Werte, die weiter entfernt sind von 0 als der ursprüngliche Wert.

Möglicherweise möchten Sie auch die Kreuzvalidierung als Methode zur Auswahl der Lössbandbreite betrachten. Dies ergibt keinen p-Wert, aber eine unendliche Bandbreite entspricht einem perfekten linearen Modell. Wenn die Kreuzvalidierung eine sehr große Bandbreite vorschlägt, kann ein lineares Modell sinnvoll sein, wenn die höheren Bandbreiten einigen deutlich unterlegen sind Je kleiner die Bandbreiten, desto deutlicher wird die Krümmung, und die Linearität reicht nicht aus.


Danke Greg! Ich denke, der erste Absatz klingt nach dem richtigen Weg, außer dass ich nicht an einem Vergleich mit einem linearen Modell interessiert bin, nur um zu sehen, ob der Spline es erklärt oder nicht. Könnten Sie bitte einen Code oder konkretere Hinweise zum Testen des Splines mit Anova geben? Ich habe mir die Funktionen bs und ns angesehen, aber ich bin nicht so gut in der Statistik, um sie selbst erfinden zu können.
Neugierig

Und ja, ich habe herausgefunden, wie man für Löss berechnet (siehe fibosworld.wordpress.com/2012/11/04/loess-regression-with-r ), aber ich habe keine Ahnung, wie man in p- konvertiert. Wert ...R 2R2R2
Neugierig

Ich habe einen Beispielcode für den anovaWith Splines-Ansatz hinzugefügt . Für den F-Test von berücksichtigen, dass die SSR geteilt durch SST und SSE geteilt durch SST ist, so dass das Verhältnis gerecht ist die SSR geteilt durch SSE (die 2 Fälle von SST heben sich auf). Wenn Sie die Freiheitsgrade und ein wenig Algebra einbeziehen, haben Sie die F-Statistik für die allgemeine Regression. R 2 1 - R 2 R 2R2R21R2R21R2
Greg Snow

Greg, danke! 1) Könnten Sie bitte erklären, was lm(y~bs(x,5))tut und warum nicht lm(y~I(bs(x,5)))? Ich bin ziemlich verwirrt von diesem Aufruf, weil das Ergebnis von bs (x, 5) keine Variable ist ... 2) Verstehe ich es richtig, dass der gesuchte p-Wert das Ergebnis von ist anova(fit0,fit2)?
Neugierig

1
Es geht nur um lineare Regression. Genau wie Sie eine lineare Regression mit , und , um eine Kurve basierend auf einem Polynom anzupassen, erstellt die Funktion Transformationen der Variablen und übergibt sie an die lineare Regression. x 2 x 3 xxx2x3bsxlm
Greg Snow
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.