使用95%CI的多个解释来绘制结果glm

时间:2014-03-06 12:40:49

标签: r plot glm poisson

数据:

df <- structure(list(x = c(9.5638945103927, 13.7767187698566, 6.0019477258207, 
10.1897072092089, 15.4019854273531, 10.9746646056535, 12.9429073949468, 
20.7513493525379, 18.5764146937149, 2.91302077116471, 13.6523222711501, 
10.0920467755108), y = c(83.949498880077, 18.066881289085, 71.3052196358606, 
39.8975644317452, 57.2933166677927, 87.8484256883889, 92.6818329896141, 
49.8297961197214, 56.3650103496898, 14.7950650020996, 37.9271392096266, 
50.4357237591891), z = c("a", "c", "e", "f", "b", "a", "b", "a", 
"b", "a", "c", "d")), .Names = c("x", "y", "z"), row.names = c(NA, 
-12L), class = "data.frame")

我的模特:

mod <- glm(y ~ x + I(x^2) + z, family=quasipoisson, data = df)
summary(mod)

我想绘制这样的事情:

ggplot(df, aes(x=x,y=y)) + 
  geom_point() +
  stat_smooth(method="lm",se=FALSE,
              formula=y~x+I(x^2),fill="transparent",
              colour="black") +
  stat_smooth(method="lm",geom="ribbon",
              formula=y~x+I(x^2),fill="transparent",
              colour="red",linetype="dashed",fullrange=TRUE) +
          scale_x_continuous(limits=c(-2,35)) +
          coord_cartesian(xlim=c(2,25),
                          ylim=range(pretty(df$y))) 

enter image description here

但是,我绘制的模型显然与mod不同,没有z且不是quasiposson

如何使用我的实际模型绘制ggplot之类的内容?我看过predict但是,当我有一个以上的解释时,我完全不知道该做什么。我不关心在ggplot2

中这样做

2 个答案:

答案 0 :(得分:7)

您似乎可以使用stat_smooth(method='glm', family=quasipoisson, ...)轻松地将示例调整为新模型,但在公式中添加z会导致错误。从ggplot2 docs开始,您可以看到predictdf是用于生成间隔限制的内容。查看该函数的代码,看起来它只是用于处理x维度的预测。但是我们可以轻松编写我们自己的多维工作版本,然后将限制绘制为单独的图层。

mypredictdf <- function (model, newdata, level=0.95){
  pred <- stats::predict(model, newdata = newdata, se =TRUE, type = "link")
  std <- qnorm(level/2 + 0.5)
  data.frame(newdata,
             y = model$family$linkinv(as.vector(pred$fit)),
             ymin = model$family$linkinv(as.vector(pred$fit - std * pred$se)),
             ymax = model$family$linkinv(as.vector(pred$fit + std * pred$se)), 
             se = as.vector(pred$se))
}
px <- with(df, seq(from=min(x), to=max(x), length=100))
pdf <- expand.grid(x=px, z=unique(df$z))
pdf <- mypredictdf(mod, newdata=pdf)
g <- ggplot(data=pdf, aes(group=z))
g <- g + geom_point(data=df, aes(x=x, y=y, color=z))
g <- g + geom_ribbon(aes(x=x, ymin=ymin, ymax=ymax),
                     alpha=0.2)
g <- g + geom_line(aes(x=x, y=y, color=z))

one panel

看起来好像是个好主意:

g <- g + facet_wrap(~z)

facetted version

答案 1 :(得分:3)

这是一种处理多个变量的方法(在您的情况下为y = f(x,z))。

mod <- glm(y ~ x + I(x^2) + z, family=quasipoisson, data = df)
pred <- predict(mod, type="response",se.fit=T)
df$pred <- pred$fit
df$se   <- pred$se.fit

ggplot(df, aes(x=y))+
  geom_point(aes(y=pred, color=z),size=3)+
  geom_errorbar(aes(ymin=pred-se, ymax=pred+se, color=z),width=1.5)+
  geom_abline(intercept=0, slope=1, color="blue", linetype=2)+
  labs(x="Actual", y="Predicted")

该图预测y与实际y,按z分组,误差条=±1×se。要获得预测的95%CL,您需要使用±1.96×se。虚线是一个参考(实际=预测),它代表完美契合。您可以从中看出z=bz=c存在问题,但z in (a,d,e,f)都很适合数据。

如果您有两个以上的变量,则分组会出现问题,但绘制预测y与实际y的关联方法仍然适用。