【发布时间】:2013-11-13 03:34:28
【问题描述】:
我正在使用mgcv 包中的gam 拟合模型并将结果存储在model 中,到目前为止,我一直在使用plot(model) 查看平滑组件。我最近开始使用 ggplot2 并喜欢它的输出。所以我想知道,是否可以使用 ggplot2 绘制这些图?
这是一个例子:
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)
我对@987654326@ 和s(x2, k=20) 不合适。
部分回答:
我深入研究了plot.gam 和mgcv:::plot.mgcv.smooth 并构建了自己的函数,该函数从平滑分量中提取预测效果和标准误差。它不能处理plot.gam 的所有选项和情况,所以我只认为它是部分解决方案,但它对我来说效果很好。
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
))
}))
}
这会返回一个带有平滑分量的“熔化”数据框,因此现在可以在上面的示例中使用ggplot:
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)
如果有人知道在一般情况下允许这样做的软件包,我将不胜感激。
【问题讨论】:
-
ggplot 将
predict用于geom_smooth,所以只需使用method='gam' -
据我了解 geom_smooth 它显示的是适合而不是平滑的条款。所以我认为这不是解决方案。
-
链接到数据集(只需引用来自
mgcv的示例作为起点和您尝试复制的图),我们可以(可能)向您展示如何。