2017-06-22 6 views
2

Je viens de terminer l'ajustement d'un GAM en utilisant le package mgcv (j'appellerai ce modèle gam1.5). J'ai joué avec la fonction vis.gam et j'ai une question que je n'ai pas réussi à résoudre.Normaliser les valeurs de l'axe z sur [0, 1] lors de l'utilisation de vis.gam pour un mgcv GAM

Je voudrais normaliser les valeurs ajustées de mon modèle de sorte que lorsque j'utilise vis.gam, l'axe z a des limites [0, 1].

Mon idée était d'appliquer la formule de normalisation dans le $fitted.values de mon modèle GAM comme suit:

gam1.5$fitted.values<-(gam1.5$fitted.values-min(gam1.5$fitted.values))/(max(gam1.5$fitted.values)-min(gam1.5$fitted.values)) 

Cependant, quand je lance le vis.gam, il ne modifie pas l'échelle de l'axe z. Je me demandais si j'applique la formule de normalisation à l'objet incorrect (un autre à $fitted.values) dans l'objet GAM.

Répondre

1

Oui. Parce que vis.gam est basé sur predict.gam et votre changement à $fitted.values n'a aucun effet!

En fait, vous ne pouvez pas atteindre votre objectif avec vis.gam. Cette fonction produit simplement un tracé et ne retourne rien pour que l'utilisateur puisse reproduire plus tard l'intrigue (sauf si vis.gam est appelée à nouveau). Cela signifie que nous devrons travailler avec predict.gam. Voici les étapes de base.

  • Configurer une grille/maillage 2D. Vous pouvez utiliser exclude.too.far pour filtrer les données loin des données d'apprentissage pour éviter une extrapolation ridicule/polynomiale (comme le fait vis.gam);
  • Construire une nouvelle trame de données newdat (à partir de la grille ci-dessus) et appeler oo <- predict.gam(gam1.5, newdat, type = "terms") pour obtenir une prédiction par le terme. Ceci est une matrice. Vous devez conserver uniquement la colonne associée à la courbe 2D que vous voulez tracer. Disons que cette colonne est stockée dans un vecteur z;
  • Augmentation z dans une matrice par remplissage NA pour ceux trop loin données.
  • Normaliser z sur [0, 1]. Utilisez image ou contour pour produire le tracé vous-même.

Idéalement, nous devrions prendre un exemple (peut-être de ?vis.gam) et de travailler à travers les étapes ci-dessus. Cependant, vous êtes revenu à moi en disant que vous avez rapidement réglé le problème en utilisant predict.gam. Ensuite, je ne vais pas ajouter d'exemples pour la démonstration.

+0

Merci beaucoup pour votre réponse! Enfin, j'ai utilisé predict.gam pour créer une nouvelle base de données et normaliser les valeurs dans cette nouvelle base de données, puis tracer une surface 3D en utilisant wireframe() comme vous l'avez suggéré! – gfmg1992