我尝试了两种方法,但我发现两者都有困难。 在用两种方法告诉你我的问题之前,我试着更好地解释哪个是我的问题。
我有数据集“接受”,其中我有一个医院中每天接受的数量,具有前面描述的独立变量。医院有三个地方我们进行访问。因此,在我的数据集中,我每天有3行,每个地方一个。数据集似乎如下:
Date Place NumerAccept weekday month NoConvention Rain
2008-01-02 Place1 203 wed Gen 0 1
2008-01-02 Place2 70 wed Gen 0 1
2008-01-02 Place3 9 wed Gen 0 1
2008-01-03 Place1 345 thu Gen 0 1
2008-01-03 Place2 24 thu Gen 0 1
2008-01-03 Place3 99 thu Gen 0 1
2008-01-04 Place1 339 fri Gen 0 0
2008-01-04 Place2 36 fri Gen 0 0
2008-01-04 Place3 101 fri Gen 0 0
....等等......我有直到昨天的数据集,所以最后三行是2013年7月29日的接受。 现在我做我的泊松回归:
poisson_reg=glm(NumeberAccept ~ 1 + weekday + month + place + NoConvention + Rain,
family = poisson(link = log), data = acceptances)
现在,对于我的预测,我创建了一个新的数据集acceptances_2,我想从中计算接下来2个月的接受次数的预测间隔!所以第一行将是今天的接受数量,最后一行将是9月29日的接受数量。
我不知道这个问题是否已经有了答案,但我无法找到答案。我正在尝试在R中进行泊松回归,我想获得预测间隔。我看到lm
的预测函数给它写了'interval="prediction"'
,但它不适用于predict.glm
!
有人知道是否有办法获得这些预测间隔?如果你有一些例子,可以输入代码吗?
所以我必须计算一家医院的日常接受次数,我有以下代码:
poisson_reg=glm(NumeberAccept ~ 1 + weekday + month + place + NoConvention + Rain,
family = poisson(link = log), data = dataset)
summary(poisson_reg)
现在,如果我输入R predict(poisson_reg, newdata, type="responce")
,我会预测每天的接受次数,但我也需要预测间隔!
我在预测调用中看到了类"lm"
的对象,您可以编写:predict(poisson_reg, newdata, interval="prediction")
并且它给出了95%的预测间隔。有没有办法用类"glm"
的对象获得相同的东西?
答案 0 :(得分:3)
这可能更像是一个统计问题,而不是一个编程问题,但是:
窃取上一个问题的示例数据:
ex <- read.table(
header=TRUE, text='
Number.Accepted Weekday Month Place
20 6 8 1
16 7 8 1
12 4 8 2
11 7 1 1
12 1 4 1
12 7 10 2
13 5 6 2
')
ex.glm <- glm(Number.Accepted ~ Weekday + Month + Place,
family = poisson, data = ex)
我们想要预测间隔的数据框:
newdata <- data.frame(Weekday=c(5,6),Month=c(9,9),Place=c(1,1))
这样的事情:
bootSimFun <- function(preddata,fit,data) {
bdat <- data[sample(seq(nrow(data)),size=nrow(data),replace=TRUE),]
bfit <- update(fit,data=bdat)
bpred <- predict(bfit,type="response",newdata=preddata)
rpois(length(bpred),lambda=bpred)
}
您也可以使用基础R中的replicate()
,但plyr::raply()
很方便:
library(plyr)
set.seed(101)
simvals <- raply(500,bootSimFun(preddata=newdata,fit=ex.glm,data=ex))
t(apply(simvals,2,quantile,c(0.025,0.975)))
## 2.5% 97.5%
## 1 7.000 40
## 2 7.475 36
答案 1 :(得分:3)
考虑Zelig包。请参阅泊松小插图 - http://rss.acs.unt.edu/Rdoc/library/Zelig/doc/poisson.pdf。
Zelig有一个统一的方法,不仅仅是建模(为此,glm()及其各种链接功能就足够了),还可以提取和绘制感兴趣的数量。特别是,要模拟预测范围 - 而不仅仅是预期范围 - 您必须模拟系数(系统组件)和误差项(随机组件)。简单地对误差项进行平均,我认为这就是predict.glm()的作用,它将为您提供更窄的预期范围。
Zelig有一个函数sim()模拟系统和随机组件,并输出可用于绘制预测范围和预期范围的内存对象。它还有一个函数setx(),你可以在sim()之前使用它,如果你想模拟你的解释变量给定值的预测不确定性。见这里 - http://rss.acs.unt.edu/Rdoc/library/Zelig/html/setx.html。
这一切都始于本文:http://gking.harvard.edu/files/abs/making-abs.shtml。 Zelig基本上是Clarify长大的。