Come posso trovare un valore p di regressione spline / loess regolare?


10

Ho alcune variabili e sono interessato a trovare relazioni non lineari tra loro. Così ho deciso di adattarmi a qualche spline o loess e stampare delle belle trame (vedi il codice sotto). Ma voglio anche avere alcune statistiche che mi danno un'idea di quanto sia probabile che la relazione sia una questione di casualità ... cioè, ho bisogno di un valore p complessivo, come ad esempio per la regressione lineare. In altre parole, devo sapere se la curva adattata ha un senso, poiché il mio codice adatta una curva a tutti i dati.

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)

Risposte:


8

La biblioteca spline ha funzioni bse nsche creerà basi spline per l'uso con la lmfunzione, quindi è possibile montare un modello lineare e un modello tra cui scanalature e utilizzare la anovafunzione per fare il pieno e ridotto di prova del modello per vedere se il modello spline si adatta significativamente migliore rispetto al modello lineare.

Ecco un esempio di codice:

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

È inoltre possibile utilizzare la polyfunzione per eseguire un adattamento polinomiale e testare i termini non lineari come test di curvatura.

Per il loess fit è un po 'più complicato. Esistono alcune stime di gradi equivalenti di libertà per il parametro di livellamento del loess che potrebbero essere utilizzati insieme ai valori per i modelli lineari e loess da costruire e F test. Penso che i metodi basati sul bootstrap e sui test di permutazione possano essere più intuitivi.R2

Esistono tecniche per calcolare e tracciare un intervallo di confidenza per un adattamento loess (penso che potrebbe esserci un modo integrato nel pacchetto ggplot2), puoi tracciare la banda di confidenza e vedere se una linea retta si adatterebbe all'interno della banda (questo non è un valore p, ma fornisce comunque un sì / no.

Potresti adattare un modello lineare e prendere i residui e adattare un modello di loess ai residui come risposta (e la variabile di interesse come predittore), se il modello vero è lineare, allora questo adattamento dovrebbe essere vicino a una linea piatta e riordinare i punti rispetto al predittore non dovrebbe fare alcuna differenza. Puoi usarlo per creare un test di permutazione. Adatta il loess, trova il valore previsto più lontano da 0, ora casualmente permuta i punti e adatta un nuovo loess e trova il punto più lontano previsto da 0, ripeti un sacco di volte, il valore p è la proporzione di valori consentiti che sono ulteriormente da 0 rispetto al valore originale.

Puoi anche considerare la convalida incrociata come metodo per scegliere la larghezza di banda degli loess. Ciò non fornisce un valore p, ma una larghezza di banda infinita corrisponde a un modello lineare perfetto, se la convalida incrociata suggerisce una larghezza di banda molto ampia, ciò suggerisce che un modello lineare può essere ragionevole, se le larghezze di banda superiori sono chiaramente inferiori ad alcuni dei le larghezze di banda minori quindi questo suggerisce una curvatura definita e lineare non è sufficiente.


Grazie Greg! Penso che il primo paragrafo suoni come la strada da percorrere, tranne per il fatto che non mi interessa il confronto con il modello lineare, solo per vedere se la spline lo spiega o no. Potresti fornire qualche codice o più indicazioni concrete su come testare la spline con Anova? Ho esaminato le funzioni bs e ns ma non sono così bravo nelle statistiche da riuscire a inventarlo da solo.
Curioso il

E sì, ho trovato come calcolare per loess (vedi fibosworld.wordpress.com/2012/11/04/loess-regression-with-r ) ma non ho idea di come convertire in p- valore ...R 2R2R2
Curioso

anovaR2R21R2R21R2

Greg, grazie! 1) Potresti spiegare cosa sta lm(y~bs(x,5))facendo e perché no lm(y~I(bs(x,5)))? Sono abbastanza confuso da questa chiamata perché il risultato di bs (x, 5) non è una variabile ... 2) Capisco correttamente che il valore p che sto cercando è il risultato anova(fit0,fit2)?
Curioso il

1
xx2x3bsxlm
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.