Come ottimizzare il livellamento nel modello GAM mgcv


14

Sto cercando di capire come controllare i parametri di smoothing in un modello di mgcv: gam.

Ho una variabile binomiale che sto provando a modellare come principalmente una funzione delle coordinate xey su una griglia fissa, più alcune altre variabili con influenze minori. In passato ho costruito un modello di regressione locale ragionevolmente buono usando il pacchetto locfit e solo i valori (x, y).

Tuttavia, voglio provare a incorporare le altre variabili nel modello e sembra che i modelli di additivi generalizzati (GAM) siano una buona possibilità. Dopo aver esaminato i pacchetti gam e mgcv, entrambi dotati di una funzione GAM, ho optato per quest'ultimo poiché un certo numero di commenti nei thread della mailing list sembrano raccomandarlo. Un aspetto negativo è che non sembra supportare una regressione locale più liscia come loess o locfit.

Per iniziare, volevo solo provare a replicare approssimativamente il modello locfit, usando solo le coordinate (x, y). Ho provato sia con i prodotti regolari che con quelli a tensore:

my.gam.te <- gam(z ~ te(x, y), family=binomial(logit), data=my.data, scale = -1)

my.gam.s  <- gam(z ~  s(x, y), family=binomial(logit), data=my.data, scale = -1)

Tuttavia, tracciando le previsioni dal modello, sono molto più uniformi rispetto al modello locfit. Quindi ho cercato di mettere a punto il modello in modo che non fosse troppo liscio. Ho provato a regolare i parametri sp e k, ma non mi è chiaro come influiscano sul livellamento. In locfit, il parametro nn controlla l'intervallo del vicinato utilizzato, con valori più piccoli che consentono meno attenuazione e più "oscillazione", che aiuta a catturare alcune aree della griglia in cui la probabilità degli esiti binomiali cambia rapidamente. Come farei per configurare il modello di gioco per consentirgli di comportarsi in modo simile?

Risposte:


22

L' kargomento imposta efficacemente la dimensionalità della matrice di smoothing per ciascun termine. gam()sta usando un punteggio GCV o UBRE per selezionare una quantità ottimale di levigatezza, ma può funzionare solo all'interno della dimensionalità della matrice di levigatura. Per impostazione predefinita, i te()levigati hanno k = 5^2superfici 2D. Dimentico a cosa serve, s()quindi controlla i documenti. Il consiglio attuale di Simon Wood, autore di mgcv , è che se il grado di levigatezza selezionato dal modello è pari o vicino al limite della dimensionalità imposta dal valore utilizzato k, è necessario aumentare ke rimontare il modello per vedere se un il modello più complesso viene selezionato dalla matrice di livellamento di dimensione superiore.

Tuttavia, non so come funziona locfit , ma devi avere qualcosa che ti impedisce di adattare una superficie troppo complessa (GCV e UBRE, o (RE) ML se scegli di usarli [non puoi come te set scale = -1], stanno provando a fare proprio questo), che non è supportato dai dati. In altre parole, potresti adattare le funzionalità molto locali dei dati ma stai adattando il rumore nel campione di dati raccolti o stai adattando la media della distribuzione di probabilità? gam() potrebbe dirti qualcosa su ciò che può essere stimato dai tuoi dati, supponendo che tu abbia risolto la dimensionalità di base (sopra).

Un'altra cosa da considerare è che i leviganti che stai attualmente utilizzando sono globali, nel senso che la levigatezza selezionata viene applicata su tutta la gamma della levigatura. Gli smoother adattativi possono spendere la "tolleranza" di smoothness assegnata in parti dei dati in cui la risposta sta cambiando rapidamente. gam()ha capacità per l'utilizzo di leviganti adattivi.

Vedi ?smooth.termse ?adaptive.smoothper vedere cosa può essere montato usando gam(). te()può combinare la maggior parte se non tutti questi smoother (controlla i documenti per i quali può e non può essere incluso nei prodotti tensore) in modo da poter utilizzare una base adattiva più fluida per provare a catturare la scala locale più fine nelle parti dei dati in cui il la risposta sta cambiando rapidamente.

Dovrei aggiungere che puoi ottenere R per stimare un modello con un insieme fisso di gradi di libertà usato da un termine regolare, usando l' fx = TRUEargomento a s()e te(). In sostanza, insieme K di essere quello che vuoi e fx = TRUEe gam()sarà solo montare una spline di regressione di gradi fissi di libertà non una spline di regressione penalizzato.


Grazie mille, Gavin, per una risposta così dettagliata. Ho completamente perso gli smalti adattivi e li proverò. Comprendo la preoccupazione per il sovradimensionamento, ma ciò che avevo fatto finora con il gam non stava mostrando funzionalità nei dati che sono noti per essere lì attraverso l'esperienza del dominio.
colonnello triq,
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.