Impostazione di nodi in spline cubiche naturali in R


23

Ho dati con molte funzionalità correlate e voglio iniziare riducendo le funzionalità con una funzione base, prima di eseguire un LDA. Sto cercando di utilizzare spline cubiche naturali nel splinespacchetto con la nsfunzione. Come posso fare per assegnare i nodi?

Ecco il codice R di base:

library(splines)
lda.pred <- lda(y ~ ns(x, knots=5))

Ma non ho idea di come scegliere i nodi ns.


3
stai chiedendo come specificare i nodi in (ovvero, tramite argomenti a ns ) o stai chiedendo strategie per decidere dove posizionare i nodi? R
cardinale il

1
Vedi Harrell, Regressione Strategies 2015, per una buona discussione su dove posizionare i nodi (non importa, quindi i quantili sono buoni come qualsiasi cosa - le eccezioni sono se hai valide ragioni per credere che i cambiamenti di comportamento ad un certo punto) e numero di nodi (3, 4 o 5 a seconda di N)
statsguy

Risposte:


40

Come specificare i nodi in R

La nsfunzione genera una base spline di regressione naturale dato un vettore di input. I nodi possono essere specificati tramite un argomento gradi di libertà dfche accetta un numero intero o tramite un argomento nodi knotsche accetta un vettore che fornisce il posizionamento desiderato dei nodi. Nota che nel codice che hai scritto

library(splines)
lda.pred <- lda(y ~ ns(x, knots=5))

non hai richiesto cinque nodi, ma piuttosto hai richiesto un singolo nodo (interno) nella posizione 5.

Se usi l' dfargomento, i nodi interni verranno selezionati in base ai quantili del vettore x. Ad esempio, se si effettua la chiamata

ns(x, df=5)

Quindi la base includerà due nodi di confine e 4 nodi interni, posizionati rispettivamente al 20 °, 40 °, 60 ° e 80 ° quantile di x. I nodi limite, per impostazione predefinita, sono posizionati al minimo e al massimo di x.

Ecco un esempio per specificare le posizioni dei nodi

x <- 0:100
ns(x, knots=c(20,35,50))

Se invece ns(x, df=4)dovessi chiamare , finiresti con 3 nodi interni nelle posizioni 25, 50 e 75, rispettivamente.

È inoltre possibile specificare se si desidera un termine di intercettazione. Normalmente questo non è specificato poiché nsviene spesso utilizzato insieme a lm, che include un'intercettazione implicitamente (a meno che non sia forzato a non farlo). Se lo usi intercept=TRUEnella tua chiamata ns, assicurati di sapere perché lo stai facendo, poiché se lo fai e poi chiami lmingenuamente, la matrice di progettazione finirà per essere carente di rango.

Strategie per il posizionamento dei nodi

I nodi sono più comunemente collocati in quantili, come il comportamento predefinito di ns. L'intuizione è che se hai molti dati raggruppati vicini, allora potresti volere più nodi lì per modellare eventuali non linearità in quella regione. Ma ciò non significa che questa sia (a) l'unica scelta o (b) la scelta migliore.

Altre scelte possono ovviamente essere fatte e sono specifiche del dominio. Guardare gli istogrammi e le stime di densità dei tuoi predittori può fornire indizi su dove sono necessari i nodi, a meno che non ci sia una scelta "canonica" data i tuoi dati.

In termini di interpretazione delle regressioni, noterò che, mentre si può certamente "giocare" con il posizionamento del nodo, è necessario rendersi conto che si incorre in una penalità di selezione del modello per questo che si dovrebbe essere attenti a valutare e adattare qualsiasi inferenza come risultato.


Dato x <- 0:100, il modo "corretto" di definire i punti di interruzione è fare knots_x <- quantile(x, probs=c(.2, .35, .5)), che sarà quindi utilizzato ns(x, knots=knots_x)per definire 3 nodi interni nelle posizioni 25, 50 e 75, rispettivamente. Ciò che mi ha confuso nella risposta è che mi aspettavo di dover specificare i quantili desiderati knotsnell'argomento, mentre ho bisogno di inserire valori reali dal xvettore ...
landroni

Analysis of Health Surveys, di Edward L. Korn, Barry I. Graubard p.98 affermano che Durrleman e Simon (1989) raccomandano (0,05,0,50,0,95) per spline naturali
Chris
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.