首页 > 解决方案 > 重新运行直到没有 NA 发生

问题描述

我有一个有时可以工作,有时不工作的代码(给出 Na),我想找到一种方法来运行有条件的代码(如果代码不起作用,请重新运行它,直到没有 NA 发生)。

这只是一个示例,因此我可以使用其他分布/数据/参数重新制作作品

 mu=3;sigma=0.3;phi=0.33;n=10
 e=rnorm(n, mean = mu, sd = sigma )

 y=e[1]
for (s in 2:n){
ynew=phi*y[s-1]+e[s]
y=c(y,ynew)
}
t=2:length(y)
ll=function(par1){
sum(-dnorm(y[t], mean = par1[1]+par1[2]*(y[t-1]), sd = par1[3],log = T)) 
     }
parstar=c(mean(y),0.1,var(y))

est_par=optim(parstar,ll,method = "Nelder-Mead")
pr1a=est_par$par
Ui=pnorm(sort(y), mean = pr1a[1],sd=pr1a[3])
## I want to have a condition for Ui so that if Ui is not Na return Ui else re-run e until Ui is not NA

标签: roptimizationna

解决方案


也许,您可以编写一个递归函数,该函数将在最后一步检查是否有任何NA值,然后再次重新运行相同的函数,直到获得非 NA 值。

calculate_fun <- function(mu, sigma, phi, n) {

   e=rnorm(n, mean = mu, sd = sigma )
   y=e[1]
   for (s in 2:n){
     ynew=phi*y[s-1]+e[s]
     y=c(y,ynew)
   }
   t=2:length(y)
   ll=function(par1){
     sum(-dnorm(y[t], mean = par1[1]+par1[2]*(y[t-1]), sd = par1[3],log = T)) 
   }
   parstar=c(mean(y),0.1,var(y))
   est_par=optim(parstar,ll,method = "Nelder-Mead")
   pr1a=est_par$par
   Ui=pnorm(sort(y), mean = pr1a[1],sd=pr1a[3])
   #added a check here
   if(any(is.na(Ui))) calculate_fun(mu, sigma, phi, n) else Ui
}

mu=3;sigma=0.3;phi=0.33;n=10
calculate_fun(mu, sigma, phi, n)

推荐阅读