r - 重新运行直到没有 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
解决方案
也许,您可以编写一个递归函数,该函数将在最后一步检查是否有任何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)