Jak znaleźć wartość p regresji gładkiego splajnu / lessa?


10

Mam kilka zmiennych i jestem zainteresowany znalezieniem między nimi nieliniowych zależności. Postanowiłem więc dopasować trochę splajnu lub lessa i wydrukować ładne wykresy (patrz kod poniżej). Ale chcę też mieć statystyki, które dają mi pojęcie, jak duże jest prawdopodobieństwo, że związek jest kwestią losowości ... tj. Potrzebuję pewnej ogólnej wartości p, jak na przykład dla regresji liniowej. Innymi słowy, muszę wiedzieć, czy dopasowana krzywa ma sens, ponieważ mój kod dopasuje krzywą do dowolnych danych.

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)

Odpowiedzi:


8

Biblioteka wypusty posiada funkcje bsi nsktóre będą tworzyć spline podstaw do stosowania z lmfunkcji, to można dopasować modelu liniowego oraz modelu tym splajnów i korzystać z anovafunkcji, aby wykonać pełną i zmniejszoną testu modelu, aby zobaczyć, czy model spline pasuje znacznie lepiej niż model liniowy.

Oto przykładowy kod:

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')

Możesz również użyć tej polyfunkcji, aby wykonać dopasowanie wielomianowe i przetestować warunki nieliniowe jako test krzywizny.

R2)

Istnieją techniki obliczania i wykreślania przedziału ufności dla dopasowania mniejszego (myślę, że może istnieć wbudowany sposób w pakiecie ggplot2), możesz wykreślić przedział ufności i sprawdzić, czy w pasmie mieści się linia prosta (to nie jest wartością p, ale nadal daje tak / nie.

Możesz dopasować model liniowy i wziąć resztki i dopasować model less do reszt jako odpowiedź (i zmienną zainteresowania jako predyktor), jeśli prawdziwy model jest liniowy, to dopasowanie powinno być bliskie płaskiej linii i zmienić kolejność punktów względem predyktora nie powinno robić żadnej różnicy. Możesz użyć tego do stworzenia testu permutacji. Dopasuj less, znajdź przewidywaną wartość najdalszą od 0, teraz losowo permutuj punkty i dopasuj nową less i znajdź najdalszy przewidywany punkt od 0, powtórz kilka razy, wartość p jest proporcją permutowanych wartości, które są dalej od 0 niż pierwotna wartość.

Możesz także spojrzeć na walidację krzyżową jako metodę wyboru mniejszej przepustowości. Nie daje to wartości p, ale nieskończona szerokość pasma odpowiada doskonałemu modelowi liniowemu, jeśli walidacja krzyżowa sugeruje bardzo dużą szerokość pasma, wówczas sugeruje to, że model liniowy może być rozsądny, jeśli wyższe szerokości pasma są wyraźnie gorsze od niektórych mniejsze szerokości pasma sugerują, że określona krzywizna i liniowość nie są wystarczające.


Dziękuję Greg! Myślę, że pierwszy akapit brzmi jak droga, z wyjątkiem tego, że nie interesuje mnie porównanie z modelem liniowym, tylko po to, aby zobaczyć, czy splajn to wyjaśnia, czy nie. Czy możesz podać kod lub więcej konkretnych wskazówek, jak przetestować splajn za pomocą anova? Patrzyłem na funkcje bs i ns, ale nie jestem tak dobry w statystyce, aby móc sam to wymyślić.
Ciekawy

R2)R2)

anovaR2)R2)1-R2)R2)1-R2)

Greg, dzięki! 1) Czy możesz wyjaśnić, co się lm(y~bs(x,5))dzieje, a dlaczego tak nie jest lm(y~I(bs(x,5)))? Jestem bardzo zdezorientowany tym wywołaniem, ponieważ wynik bs (x, 5) nie jest zmienną ... 2) Czy rozumiem poprawnie, że szukana wartość p jest wynikiem anova(fit0,fit2)?
Ciekawy

1
xx2)x3)bsxlm
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.