如何解决如何在for循环中设置条件以打破
我试图将AR(1)ols调整为较小的样本偏差,所以我编写了一个代码,然后在loop函数中设置break,但是总是失败,如何在for loop中设置条件?
n = 31 # simulate regression samples
yt <- c()
ANS <- rep(NA,1000) # create a place for beta loop
for (M in c((1:3)/100)) { # after 1000 beta loop,I want simulate AR(1)+0.01 (EX:0.91、0.92、0.93...) Data for next loop in beta
for (i in 1:1000){ # Monte Carole to estimate beta
yt[1] <- rnorm(1,1)
for (z in 2:n) { # simulate AR(1)=0.9+M loop
yt[z] <- (0.9 + M) * yt[z-1] + rnorm(1,1)
}
yt
X <- yt[-n]
beta <- solve(t(X) %*% X) %*% t(X) %*% yt[-1] # Estimate AR(1) coeff(beta)
ANS[i] <- sort(beta)
cat(M," ","\n")
### if (beta[500] - 0.9 <= 0.01) break ### I want set this condition to stop loop but failed,get error message : Error in if (beta[500] - 0.9 <= 1) break,missing value where TRUE/FALSE needed
}}
ifelse(abs(quantile(ANS,probs = c(0.5)) - 0.9) <= 0.01,TRUE,FALSE ) # Because I didn't know how to set break in it,I had to operate it manually
。
下面我尝试添加“ if(beta [500]-0.9
n = 31 # simulate regression samples
yt <- c()
ANS <- rep(NA,"\n")
if (beta[500] - 0.9 <= 0.01) break
}}
有人知道设置条件时为什么会出错吗? #如果(beta [500]-0.9
解决方法
break
将打破最近的for
循环,但不会超出循环范围。在这种情况下,它位于内部循环for (1 in 1:1000)
中,因此它会中断,但是外部循环(for (M in ...)
)将继续。
如果您想要内部循环中的条件但又希望同时出现,请考虑某种类型的标志,该标志已预定义为不会爆发,而是在需要时设置。我将在这里使用breakout
:
breakout <- FALSE
n = 31 # simulate regression samples
yt <- c()
ANS <- rep(NA,1000) # create a place for beta loop
for (M in c((1:3)/100)) {
for (i in 1:1000){
yt[1] <- rnorm(1,1)
for (z in 2:n) {
yt[z] <- (0.9 + M) * yt[z-1] + rnorm(1,1)
}
yt
X <- yt[-n]
beta <- solve(t(X) %*% X) %*% t(X) %*% yt[-1] # Estimate AR(1) coeff(beta)
ANS[i] <- sort(beta)
cat(M," ","\n")
if (beta[500] - 0.9 <= 0.01) {
breakout <- TRUE
break
}
}
if (breakout) break
}
您还没有分享您的错误,因此我将显示:
Error in if (beta[500] - 0.9 <= 0.01) break (from #12) :
missing value where TRUE/FALSE needed
这是为什么?当beta[500]
仅是一个数字时,您正在引用beta
。您应该手动跟踪代码以查找错误发生的地方,因为这是缩小错误范围的最快方法。
M <- 0.01
i <- 1
yt[1] <- rnorm(1,1)
for (z in 2:n) { # simulate AR(1)=0.9+M loop
yt[z] <- (0.9 + M) * yt[z-1] + rnorm(1,1)
}
X <- yt[-n]
beta <- solve(t(X) %*% X) %*% t(X) %*% yt[-1] # Estimate AR(1) coeff(beta)
beta
# [,1]
# [1,] 0.890663
ANS[i] <- sort(beta)
cat(M,"\n")
# 0.01
if (beta[500] - 0.9 <= 0.01) break
# Error in if (beta[500] - 0.9 <= 0.01) break :
# missing value where TRUE/FALSE needed
# x
那为什么呢?
beta[500] - 0.9 <= 0.01
# [1] NA
beta[500]
# [1] NA
beta
# [,] 0.890663
那为什么呢?好吧,即使i
为1000,beta
也是将矩阵简化为1x1矩阵。您的条件beta[500]
的前提已损坏。我不知道您认为应该将它与什么进行比较,但这是行不通的。
修正数学背后的逻辑,然后逐步执行代码,以确保尺寸/长度等符合您的想象。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。