ticks ggtitle ggplot element_text r ggplot2 gam mgcv

ggtitle - ¿Es posible trazar los componentes suaves de un juego en ggplot2?



ggplot legend title (2)

Para su información, visreg puede visreg directamente un objeto gg :

visreg(model, "x1", gg=TRUE)

Estoy ajustando un modelo usando gam del paquete mgcv y mgcv el resultado en el model y hasta ahora he estado observando los componentes lisos utilizando plot(model) . Recientemente he empezado a usar ggplot2 y me gusta su salida. Así que me pregunto, ¿es posible trazar estos gráficos usando ggplot2?

Aquí hay un ejemplo:

x1 = rnorm(1000) x2 = rnorm(1000) n = rpois(1000, exp(x1) + x2^2) model = gam(n ~ s(x1, k=10) + s(x2, k=20), family="poisson") plot(model, rug=FALSE, select=1) plot(model, rug=FALSE, select=2)

Y estoy interesado en s(x1, k=10) y s(x2, k=20) no en el ajuste.

Respuesta parcial:

plot.gam más profundamente en plot.gam y mgcv:::plot.mgcv.smooth y construí mi propia función que extrae los efectos predichos y los errores estándar de los componentes suaves. No maneja todas las opciones y casos de plot.gam así que solo lo considero una solución parcial, pero funciona bien para mí.

EvaluateSmooths = function(model, select=NULL, x=NULL, n=100) { if (is.null(select)) { select = 1:length(model$smooth) } do.call(rbind, lapply(select, function(i) { smooth = model$smooth[[i]] data = model$model if (is.null(x)) { min = min(data[smooth$term]) max = max(data[smooth$term]) x = seq(min, max, length=n) } if (smooth$by == "NA") { by.level = "NA" } else { by.level = smooth$by.level } range = data.frame(x=x, by=by.level) names(range) = c(smooth$term, smooth$by) mat = PredictMat(smooth, range) par = smooth$first.para:smooth$last.para y = mat %*% model$coefficients[par] se = sqrt(rowSums( (mat %*% model$Vp[par, par, drop = FALSE]) * mat )) return(data.frame( label=smooth$label , x.var=smooth$term , x.val=x , by.var=smooth$by , by.val=by.level , value = y , se = se )) })) }

Esto devuelve un marco de datos "fundido" con los componentes suaves, por lo que ahora es posible usar ggplot con el ejemplo anterior:

smooths = EvaluateSmooths(model) ggplot(smooths, aes(x.val, value)) + geom_line() + geom_line(aes(y=value + 2*se), linetype="dashed") + geom_line(aes(y=value - 2*se), linetype="dashed") + facet_grid(. ~ x.var)

Si alguien sabe un paquete que permite esto en el caso general, estaría muy agradecido.


Puede utilizar el paquete visreg combinado con el paquete plyr. visreg básicamente traza cualquier modelo en el que puedas usar predict ().

library(mgcv) library(visreg) library(plyr) library(ggplot2) # Estimating gam model: x1 = rnorm(1000) x2 = rnorm(1000) n = rpois(1000, exp(x1) + x2^2) model = gam(n ~ s(x1, k=10) + s(x2, k=20), family="poisson") # use plot = FALSE to get plot data from visreg without plotting plotdata <- visreg(model, type = "contrast", plot = FALSE) # The output from visreg is a list of the same length as the number of ''x'' variables, # so we use ldply to pick the objects we want from the each list part and make a dataframe: smooths <- ldply(plotdata, function(part) data.frame(Variable = part$meta$x, x=part$fit[[part$meta$x]], smooth=part$fit$visregFit, lower=part$fit$visregLwr, upper=part$fit$visregUpr)) # The ggplot: ggplot(smooths, aes(x, smooth)) + geom_line() + geom_line(aes(y=lower), linetype="dashed") + geom_line(aes(y=upper), linetype="dashed") + facet_grid(. ~ Variable, scales = "free_x")

Podemos poner todo en una función y agregar una opción para mostrar los residuos del modelo (res = TRUE):

ggplot.model <- function(model, type="conditional", res=FALSE, col.line="#7fc97f", col.point="#beaed4", size.line=1, size.point=1) { require(visreg) require(plyr) plotdata <- visreg(model, type = type, plot = FALSE) smooths <- ldply(plotdata, function(part) data.frame(Variable = part$meta$x, x=part$fit[[part$meta$x]], smooth=part$fit$visregFit, lower=part$fit$visregLwr, upper=part$fit$visregUpr)) residuals <- ldply(plotdata, function(part) data.frame(Variable = part$meta$x, x=part$res[[part$meta$x]], y=part$res$visregRes)) if (res) ggplot(smooths, aes(x, smooth)) + geom_line(col=col.line, size=size.line) + geom_line(aes(y=lower), linetype="dashed", col=col.line, size=size.line) + geom_line(aes(y=upper), linetype="dashed", col=col.line, size=size.line) + geom_point(data = residuals, aes(x, y), col=col.point, size=size.point) + facet_grid(. ~ Variable, scales = "free_x") else ggplot(smooths, aes(x, smooth)) + geom_line(col=col.line, size=size.line) + geom_line(aes(y=lower), linetype="dashed", col=col.line, size=size.line) + geom_line(aes(y=upper), linetype="dashed", col=col.line, size=size.line) + facet_grid(. ~ Variable, scales = "free_x") } ggplot.model(model) ggplot.model(model, res=TRUE)

Los colores se seleccionan de http://colorbrewer2.org/ .