Comment régler le lissage dans le modèle mgcv GAM


14

J'essaie de comprendre comment contrôler les paramètres de lissage dans un modèle mgcv: gam.

J'ai une variable binomiale que j'essaie de modéliser principalement en fonction des coordonnées x et y sur une grille fixe, ainsi que d'autres variables avec des influences plus mineures. Dans le passé, j'ai construit un modèle de régression local relativement bon en utilisant le package locfit et uniquement les valeurs (x, y).

Cependant, je veux essayer d'incorporer les autres variables dans le modèle, et il semblait que les modèles additifs généralisés (GAM) étaient une bonne possibilité. Après avoir examiné les packages gam et mgcv, qui ont tous deux une fonction GAM, j'ai opté pour ce dernier car un certain nombre de commentaires dans les discussions de la liste de diffusion semblent le recommander. Un inconvénient est qu'il ne semble pas soutenir une régression locale plus douce comme le loess ou le locfit.

Pour commencer, je voulais juste essayer de répliquer approximativement le modèle locfit, en utilisant seulement les coordonnées (x, y). J'ai essayé avec des lissages de produits réguliers et tenseurs:

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)

Cependant, en traçant les prévisions à partir du modèle, elles sont beaucoup plus lissées que le modèle locfit. J'ai donc essayé de régler le modèle pour ne pas trop lisser autant. J'ai essayé d'ajuster les paramètres sp et k, mais je ne comprends pas comment ils affectent le lissage. Dans locfit, le paramètre nn contrôle l'étendue du voisinage utilisé, avec des valeurs plus petites permettant moins de lissage et plus de «tremblements», ce qui aide à capturer certaines zones de la grille où la probabilité des résultats binomiaux change rapidement. Comment pourrais-je configurer le modèle gam pour lui permettre de se comporter de la même manière?

Réponses:


22

L' kargument établit efficacement la dimensionnalité de la matrice de lissage pour chaque terme. gam()utilise un score GCV ou UBRE pour sélectionner une quantité optimale de lissage, mais cela ne peut fonctionner que dans la dimensionnalité de la matrice de lissage. Par défaut, les te()lissages ont k = 5^2des surfaces 2D. J'ai oublié à quoi ça sert, s()alors vérifiez les documents. L'avis actuel de Simon Wood, auteur de mgcv , est que si le degré de lissage sélectionné par le modèle est égal ou proche de la limite de la dimensionnalité imposée par la valeur utilisée pour k, vous devez augmenter ket réajuster le modèle pour voir si un un modèle plus complexe est sélectionné dans la matrice de lissage de dimension supérieure.

Cependant, je ne sais pas comment fonctionne locfit , mais vous devez avoir quelque chose qui vous empêche d'adapter une surface trop complexe (GCV et UBRE, ou (RE) ML si vous choisissez de les utiliser [vous ne pouvez pas comme vous set scale = -1], essaient de faire exactement cela), ce qui n'est pas pris en charge par les données. En d'autres termes, vous pourriez adapter des caractéristiques très locales des données, mais ajustez-vous le bruit dans l'échantillon de données que vous avez collectées ou ajustez-vous la moyenne de la distribution de probabilité? gam() peut vous dire quelque chose sur ce qui peut être estimé à partir de vos données, en supposant que vous avez trié la dimensionnalité de base (ci-dessus).

Une autre chose à considérer est que les lissoirs que vous utilisez actuellement sont globaux dans le sens où le lissage sélectionné est appliqué sur toute la plage du lissé. Les lisseurs adaptatifs peuvent dépenser «l'allocation» de lissage attribuée dans des parties des données où la réponse change rapidement. gam()a des capacités d'utilisation de lisseurs adaptatifs.

Voir ?smooth.termset ?adaptive.smoothvoir ce qui peut être installé à l'aide gam(). te()peut combiner la plupart sinon la totalité de ces lissoirs (vérifiez les documents pour lesquels peuvent et ne peuvent pas être inclus dans les produits tenseurs) afin que vous puissiez utiliser une base adaptative plus lisse pour essayer de capturer l'échelle locale plus fine dans les parties des données où le la réponse varie rapidement.

Je dois ajouter que vous pouvez demander à R d'estimer un modèle avec un ensemble fixe de degrés de liberté utilisé par un terme lisse, en utilisant l' fx = TRUEargument to s()et te(). Au fond, ensemble k être ce que vous voulez et fx = TRUEet gam()passera juste une spline de régression des degrés de liberté fixes non une spline de régression pénalisée.


Merci beaucoup, Gavin, pour cette réponse si détaillée. J'ai complètement raté les lissoirs adaptatifs et je vais les essayer. Je comprends l'inquiétude suscitée par le surapprentissage, mais ce que j'avais fait jusqu'à présent avec gam ne montrait pas les caractéristiques des données qui sont connues pour être présentes grâce à l'expertise du domaine.
colonel triq
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.