【问题标题】:How to set condition in for loop to break如何在for循环中设置条件以中断
【发布时间】:2021-02-05 00:53:08
【问题描述】:

我尝试调整AR(1) ols小样本偏差,所以我写了一个代码然后在循环函数中设置break但总是失败,我如何在for循环中设置条件?

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,0,1)

  for (z in 2:n) { # simulate AR(1)=0.9+M loop 
  
  yt[z] <- (0.9 + M) * yt[z-1] + rnorm(1,0,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,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,0,1)

  for (z in 2:n) { # simulate AR(1)=0.9+M loop 
  
  yt[z] <- (0.9 + M) * yt[z-1] + rnorm(1,0,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 
}}

有谁知道我设置条件时为什么会出错? # if (beta[500] - 0.9

【问题讨论】:

  • 可能有助于发布您的错误
  • 不要在这里使用ifelse。如果您的条件已知长度为 1,那么您应该使用if 和可选的else。时期。使用ifelse 有一些陷阱,在这种情况下,滥用它表明设计不佳。
  • 此外,您对分位数的检查在for 循环的之外,因此break 将不起作用。如果要中断for循环,则需要if,并且需要将for循环放入内部,如for (ing in 1:100) { if (ind &gt; 50) break ; }

标签: r loops for-loop statistics regression


【解决方案1】:

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,0,1)
    for (z in 2:n) {
      yt[z] <- (0.9 + M) * yt[z-1] + rnorm(1,0,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 只是一个数字时,您正在引用beta[500]。您应该手动跟踪代码以查找错误发生的位置,因为这是缩小错误范围的最快方法。

M <- 0.01
i <- 1
    yt[1] <- rnorm(1,0,1)
    for (z in 2:n) { # simulate AR(1)=0.9+M loop 
      yt[z] <- (0.9 + M) * yt[z-1] + rnorm(1,0,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
#          [,1]
# [1,] 0.890663

那为什么会这样呢?好吧,即使i 是 1000,beta 也是矩阵缩减为 1x1 矩阵。你的条件beta[500] 的前提被打破了。我不知道你认为它应该与什么进行比较,但那是行不通的。

修正数学背后的逻辑,然后逐步运行代码以确保尺寸/长度等是您想象的那样。

【讨论】:

  • 非常感谢您的建议,特别是对“break”功能的解释。我从中吸取了教训。我想设置“break”的目的是停止“for M loop”。如果中位数非常接近原始系数 0.9,则停止。
  • 我已经运行了你的代码,但仍然得到同样的错误。不知道哪一步是错的。还是使用 while 循环比 for in 条件更好?
  • 您需要了解如何对代码进行故障排除。我为您逐步完成了它,演示了我看到的错误所在的位置以及为什么它是一个错误。我不知道如何解决它,因为我不知道你认为你想要做什么。希望这会有所帮助。
  • 感谢您的帮助!从您的消息中,我意识到为什么会出错。我使用 na.omit 函数删除 NA 并将中位数更改为均值。这是工作。
猜你喜欢
  • 2020-06-27
  • 2021-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-23
  • 2014-05-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多