2017-03-17 1 views
0

Je souhaite ajouter un dégradé de couleurs suivant les valeurs ajustées (par exemple, des valeurs ajustées plus élevées, des couleurs plus foncées, des couleurs plus claires) dans mes diagrammes de dépendance tridimensionnels.BRT: Ajouter des couleurs de dégradé aux tracés d'interaction en utilisant gbm.perspec

J'ai utilisé l'exemple présenté dans Dismo package:

library(dismo) 
data(Anguilla_train) 
angaus.tc5.lr01 <- gbm.step(data=Anguilla_train, gbm.x = 3:13, gbm.y = 2, 
family = "bernoulli", tree.complexity = 5, learning.rate = 0.01, 
bag.fraction = 0.5) 

# Find interactions in the gbm model: 
find.int <- gbm.interactions(angaus.tc5.lr01) 
find.int$interactions 
find.int$rank.list 

J'ai seulement réussi à ajouter de la même couleur à la parcelle:

gbm.perspec(angaus.tc5.lr01, 7, 1, 
      x.label = "USRainDays", 
      y.label = "SegSumT", 
      z.label = "Fitted values", 
      z.range=c(0,0.435), 
      col="blue") 

Interaction plot all in one colour

ou pour ajouter une couleur de dégradé mais ne suivant pas les valeurs ajustées:

gbm.perspec(angaus.tc5.lr01, 7, 1, 
      x.label = "USRainDays", 
      y.label = "SegSumT", 
      z.label = "Fitted values", 
      col=heat.colors(50), 
      z.range=c(0,0.435)) 

Interaction plot with different colours not following fitted values

J'ai aussi vérifié le code de la fonction gbm.perspec, et si je comprends bien les valeurs ajustées sont appel dans la formule comme « prédiction », et plus tard font partie de la « pred.matrix » cela est passé au tracé final: persp (x = x.var, y = y.var, z = pred.matrix ...), mais je n'ai pas réussi à y accéder à partir de la formule de gbm.perspec. J'ai essayé de modifier la fonction gbm.perpec en ajoutant "col = heat.colors (100) [round (pred.matrix * 100, 0)]" dans le persp() dans la fonction, mais il ne fait pas ce que je suis recherche:

persp(x = x.var, y = y.var, z = pred.matrix, zlim = z.range, 
     xlab = x.label, ylab = y.label, zlab = z.label, 
     theta = theta, phi = phi, r = sqrt(10), d = 3, 
     ticktype = ticktype, 
     col=heat.colors(100)[round(pred.matrix*100, 0)], 
     mgp = c(4, 1, 0), ...) 

Interaction plot coloured following predicted values (?) but not showing the colours properly

Je crois que la solution pourrait venir de modifier la fonction gbm.perpec, ne savez-vous comment?

Nous vous remercions de votre temps!

Répondre

0

Modifier la fonction gbm.perspec est certainement une option, bien que si vous utilisez les valeurs prédites du modèle gbm et que vous les traciez sur un diagramme de dispersion 3D d'un autre paquet, vous devriez également pouvoir le faire.

Voici une option utilisant le paquet plot3Drgl, le code original a été fourni par @Fabrice.

library(dismo); library(plot3Drgl); library(devEMF) 
data(Anguilla_train) 
angaus.tc5.lr01 <- gbm.step(data=Anguilla_train, gbm.x = 3:13, gbm.y = 2, 
          family = "bernoulli", tree.complexity = 5, learning.rate = 0.01, 
          bag.fraction = 0.5) 

# Find interactions in the gbm model: 
find.int <- gbm.interactions(angaus.tc5.lr01) 
find.int$interactions 
find.int$rank.list 

d<-plot(angaus.tc5.lr01,c(1,7),return.grid=T) 


x <- d$SegSumT 
y <- d$USRainDays 
z <- d$y 


grid.lines = 30 
elevation.site = loess(z ~ x*y, data=d, span=1, normalize = FALSE) 
x.pred <- seq(min(x), max(x), length.out = grid.lines) # x grid 
y.pred <- seq(min(y), max(y), length.out = grid.lines) # y grid 
xy <- expand.grid(x = x.pred, y = y.pred) # final grid combined 
z.site=matrix(predict(elevation.site, newdata = xy), nrow = grid.lines, ncol = grid.lines) # predicedt matrix 

scatter3D(x, y, z, theta = 160, phi = 35, # x y z coords and angle of plot 
      clab = c(""), # Needs moving - label legend 
      colkey = list(side = 4, length = 0.65, 
         adj.clab = 0.15, dist = -0.15, cex.clab = 0.6, cex.axis = 0.6), # change the location and length of legend, change position of label and legend 
      clim = c(-4,0.1), 
      bty = "b", # type of box 
      col = ramp.col(col = c("grey", "blue"), 200), 
      pch = 19, cex = 0.55, # shape and size of points 
      xlab = "SegSumT", 
      xlim=c(10,20),ylim=c(0,3.5), zlim=c(-4,0.1), d= 2, 
      ylab = "USRaindays", 
      zlab= "Fitted values", #axes labels 
      cex.lab = 0.8, font.lab = 1, cex.axis = 0.6, font.axis= 1, # size and font of axes and ticks 
      ticktype = "detailed", nticks = 5, # ticks and numer of ticks 
      #type = "h", # vertical lines 
      surf = list(x = x.pred, y = y.pred, z = z.site, 
         facets = NA, CI=NULL)) 

enter image description here

En tordant avec grid.lines et inverser l'axe x, vous devriez être en mesure de produire exactement ce que vous voulez.