我有一个时间序列模型(INGARCH):
lambda_t = alpha0 + alpha1*(x_(t-1)) + beta1*(lambda_(t-1))
X_t ~ poisson (lambda_t)
其中t是观测值或数据的长度,alpha0,alpha1和beta1是参数。
X_t
是数据序列,lambda_t是均值序列。
此模型的条件为alpha1 + beta1 < 1
。
据我估计,我想在代码中添加alpha1 + beta1 <
1的条件,在对数似然函数中添加一个while循环,但是该循环无法停止。
我该怎么做才能解决这个问题?是否有其他方法可以在不使用while循环的情况下添加约束alpha1 + beta1 < 1
?
下面是我的代码:
ll <- function(par) {
h.new = rep(0,n)
#par[1] is alpha0
#par[2] is alpha1
#par[3] is beta1
while(par[2] + par[3] < 1){
for (i in 2:n) {
h.new[i] <- par[1] + par[2] * dat[i-1] + par[3] * h.new[i-1]
}
-sum(dpois(dat, h.new, log=TRUE))
}
}
#simply generate a dataset as I have not found a suitable real dataset to fit in
set.seed(77)
n=400
dat <- rpois(n,36)
nlminb(start = c(0.1,0.1,0.1), lower = 1e-6, ll)
答案 0 :(得分:1)
您暂时不更改par
。尤其是,如果您同时打印了par[1]
和par[2]
,将会发现您无休止地打印了原始值0.1,因此您永远都陷在while
中。 / p>
par
是来自nlminb
的每个调用中的单个不变对象。您只需要确保par不好,就返回非最小的值,因此nlminb
不会继续朝该方向搜索:
ll <- function(par) {
#If alpha + beta > 1, this is terrible and return an infinite score
#It may be better to throw an error if you get NaN values! The if will
#fail anyway, but if you want to power through add checks:
if( is.nan(par[2]) || is.nan(par[3]) || par[2]+par[3]>1) return(Inf)
h.new = rep(0,n)
#remove while
for (i in 2:n) {
h.new[i] <- par[1] + par[2] * dat[i-1] + par[3] * h.new[i-1]
}
-sum(dpois(dat, h.new, log=TRUE))
}
算法nlminb
(或任何最小化函数)大致适用:
猜测新参数:
a。如果分数没有太大改善,则返回最小猜测值
b。如果分数不错,请继续朝这个方向搜索
c。否则,向其他方向搜索
使用新参数返回(2)
请注意,您必须为每组参数返回一个分数,而不必在目标函数中对其进行迭代。