比较物流家庭的bsts预测方法

时间:2019-02-26 22:40:49

标签: r

我的问题涉及在将bsts模型拟合到训练数据之后,两种预测二项式结果的方法的比较。方法A使用predict.bsts,而方法B使用最终状态并直接拟合回归系数。 B与提供二项式抽取的A不同,B似乎提供了更好的预测,并从预测的概率中提供了样本(启用CI)。问题:我是否误解了A,为什么这些方法会得出不同的结果,而B实际上更好?

下面,A和B用于根据时间1:(j-1)的响应和协变量以及时间j的协变量来预测时间j的响应。根据{{​​3}}

中的示例3的优先级
set.seed(1)
x1<-rnorm(100)
x2<-rpois(100,3)
x3<-runif(100)
g<-function(t) sin(pi*t/100)
lp<-2*g(1:100)+1.8*x1-x2
#trend, and no dependence on x3
h<-function(t) (1+exp(-t))^-1
p<-h(lp)
y<-rbinom(N,1,p)

burn=1:1000

ss<-AddLocalLevel(list(),
sigma.prior=SdPrior(sigma.guess=0.1,sample.size=1,upper.limit=1),
initial.state.prior=NormalPrior(0,5))

mod1<-bsts(y~-1+x1+x2+x3,family="logit",
state.specification=ss,niter=2000,seed=12345)
plot(mod1,"comp")
plot(mod1,"coef")

S=10
fit1<-fit2<-rep(NA,N)
pb<-txtProgressBar(min=S,max=N,initial=S,style=3)
for (j in S:N)
{
setTxtProgressBar(pb,value=j)
yj<-y[1:(j-1)]
x1j<-x1[1:(j-1)]
x2j<-x2[1:(j-1)]
x3j<-x3[1:(j-1)]

ssj<-AddLocalLevel(list(),
sigma.prior=SdPrior(sigma.guess=0.1,
sample.size=1,upper.limit=1),
initial.state.prior=NormalPrior(0,5))
mod1j<-bsts(yj~-1+x1j+x2j+x3j,
family="logit",state.specification=ssj,
niter=2000,seed=12345)
newj<-data.frame(x1j=x1[j],x2j=x2[j],x3j=x3[j])
#method A
predj<-predict(mod1j,newdata=newj,seed=12345)
fit1[j]<-predj$mean
#method B
preddj<-sapply(mod1j$fin[-burn,]+mod1j$coef[-burn,]%*%t(as.matrix(newj)),h)
fit2[j]<-mean(preddj)
}

mse1<-round(sum((y[S:N]-fit1[S:N])^2)/(N-S+1),2)
mse2<-round(sum((y[S:N]-fit2[S:N])^2)/(N-S+1),2)
mse1x<-round(sum((y[(N/2+1):N]-fit1[(N/2+1):N])^2)/(N/2),2)
mse2x<-round(sum((y[(N/2+1):N]-fit2[(N/2+1):N])^2)/(N/2),2)

plot(1:N,y,col=ifelse(y==1,"red","blue"))
for (j in 1:N)
{
points(j,fit1[j],pch=20,col="seagreen")
points(j,fit2[j],col="brown")
lines(c(j,j),c(0,1),lty=2,col="grey")
}
text(0,0.5,pos=4,paste("mse1=",mse1,sep=""))
text(0,0.45,pos=4,paste("mse2=",mse2,sep=""))
text(0,0.3,pos=4,paste("mse1x=",mse1x,sep=""))
text(0,0.25,pos=4,paste("mse2x=",mse2x,sep=""))

#mse2<mse1 and mse2x<mse1x

模拟

在50组模拟数据中,适用于g,x1和x2的系数由rnorm(3)设置。在41次运行中,mse2低于mse1。在42次运行中,mse2x低于mse1x。 mse1,mse2,mse1x和mse2x的平均值分别为0.2366、0.1418、0.2426、0.1354。

0 个答案:

没有答案