- 阅读权限
- 255
- 威望
- 1 级
- 论坛币
- 170716 个
- 通用积分
- 8029.6016
- 学术水平
- 207 点
- 热心指数
- 257 点
- 信用等级
- 151 点
- 经验
- 878 点
- 帖子
- 2429
- 精华
- 0
- 在线时间
- 4069 小时
- 注册时间
- 2005-11-15
- 最后登录
- 2025-11-15
|
chenhao1101 发表于 2014-3-2 22:48 
是的啊,一直没人解读! 你的模型设定里的vr部分不能保证是大0,为了计算能进行下去,我用vr=abs(...)代替了原来的vr。代码是用R语言写的,没有加各种的错误识别和规避的部分,所以,实际数据如果不事先剔除一些极端值的话会有错误发生。 - ##generate time series
- set.seed(83)
- epsilon <- rnorm(1500,0,1)
- rts <- epsilon
- vrr <- numeric(1500)
- for(i in 2:1500){
- ur <- 0.01+0.06*rts[i-1]+0.05*rts[i-1]^2-0.04*rts[i-1]^3+0.03*rts[i-1]^4-0.02*rts[i-1]^5+0.01/rts[i-1]
- vr <- sqrt(0.0005+0.0006*rts[i-1]+0.0007*rts[i-1]^2)*epsilon[i]
- rts[i]=ur+vr+rts[i-1]
- vrr[i] <- 0.0005+0.0006*rts[i-1]+0.0007*rts[i-1]^2
- }
- View(rts)
- y <- rts[500:1500]
- plot(y,type="l")
- rm(i,ur,vr)
- ##transform data
- dy <- diff(y,lag=1,differences=1)
- est_data <- as.data.frame(cbind(dy,rep(1,1000),y[-1],y[-1]^2,y[-1]^3,y[-1]^4,y[-1]^5,1/y[-1]))
- dimnames(est_data)[[2]] <- c("deltay","slop","y1","y2","y3","y4","y5","y6")
- View(est_data)
- ##code mle function
- attach(est_data)
- mlefunc <- function(x){
- sapply(1:11,function(z) assign(paste("x",z,sep=""),x[z],pos=1))
- urf <- x11*slop+x1*y1+x2*y2+x3*y3+x4*y4+x5*y5+x6*y6
- vrf <- abs(x7*slop+x8*y1+x9*y1^x10)
- sum(-log(vrf)-((deltay-urf)^2)/ifelse(vrf<1e-8,1e-4,vrf))
- }
- mlegrfunc <- function(x){
- sapply(1:11,function(z) assign(paste("x",z,sep=""),x[z],pos=1))
- ugr <- x11*slop+x1*y1+x2*y2+x3*y3+x4*y4+x5*y5+x6*y6
- vgr <- abs(x7*slop+x8*y1+x9*y1^x10)
- c(sum(2*(deltay-ugr)*y1/vgr),
- sum(2*(deltay-ugr)*y2/vgr),
- sum(2*(deltay-ugr)*y3/vgr),
- sum(2*(deltay-ugr)*y4/vgr),
- sum(2*(deltay-ugr)*y5/vgr),
- sum(2*(deltay-ugr)*y6/vgr),
- sum(-1/ifelse(vgr<1e-8,1e-4,vgr)+(deltay-ugr)^2/ifelse(vgr^2<1e-8,1e-4,vgr^2)),
- sum(-y1/ifelse(vgr<1e-8,1e-4,vgr)+y1*(deltay-ugr)^2/ifelse(vgr^2<1e-8,1e-4,vgr^2)),
- sum(-y1^x10/ifelse(vgr<1e-8,1e-4,vgr)+y1^x10*(deltay-ugr)^2/ifelse(vgr^2<1e-8,1e-4,vgr^2)),
- sum(-x9*log(abs(y1))*y1^x10/ifelse(vgr<1e-8,1e-4,vgr)+-x9*log(abs(y1))*y1^x10*(deltay-ugr)^2/ifelse(vgr^2<1e-8,1e-4,vgr^2)),
- sum(2*(deltay-ugr)/vgr)
- )
- }
- ##optmize mlefunc
- sann_out <- optim(rep(0.01,11),mlefunc,method="SANN")
- sann_out
- bfgs_out <- optim(rep(0.01,11),fn=mlefunc,gr=mlegrfunc,method="BFGS")
- bfgs_out
- lbfgsb_out <- optim(rep(0.01,11),fn=mlefunc,gr=mlegrfunc,method="L-BFGS-B")
- lbfgsb_out
- neldermead_out <- optim(rep(0.01,11),fn=mlefunc,gr=mlegrfunc,method="Nelder-Mead")
- neldermead_out
- cg_out <- optim(rep(0.01,11),fn=mlefunc,gr=mlegrfunc,method="CG")
- cg_out
- #brent_out <- optim(rep(0.01,11),fn=mlefunc,gr=mlegrfunc,method="Brent")
- #brent_out
- detach(est_data)
- rm(list=ls(pattern="^x"))
- save.image("archmle.RData")
复制代码计算的结果是用Nelder-Mead方法较接近真实值。用梯度函数的optimize方法较其他方法估计结果稳定。
注意:估计结果和真实值不等,非常期待大神能给我指出不足之处
|
-
总评分: 论坛币 + 100
查看全部评分
|