R 重新运行,直到没有发生NA
我有一个代码,有时有效,有时无效(给出Na),我想找到一种方法来运行有条件的代码(如果代码无效,重新运行它,直到没有Na出现) 这只是一个例子,因此我可以使用其他分布/数据/参数重新生成工作R 重新运行,直到没有发生NA,r,optimization,na,R,Optimization,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(pa
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)
calculate\u fun我运行了您的代码10000次,并且Ui
从未NA
也未包含NA
,尽管警告是从dnorm
生成的。请澄清,正常情况下,我没有得到Na,但如果我改变分布,我得到Na。我的原始代码有复杂的分布和很长的ll函数代码,这就是为什么我给出了正态分布的例子。对不起,我应该在我的问题中提到重复{do_something();x