R for 循环 n 次

标签 r for-loop loess

我正在尝试编写一个 for 循环来重复 (c) 和 (d) 100 次。我想在 for 循环的每次迭代中打印 TRS-TRS0 的估计值。如果它很小(比如 1/10000),它应该停止算法。最后,我希望它创建一个图,其中显示每个值。

我想我在这里拥有一切,但是当我运行它时,我没有看到任何事情发生。我错过了什么吗?

for (i in 1:100){
  #c)
  fit1 = loess(res~x2, data=data.frame(res,x1,x2))
  f2=predict(fit1,newdata=data.frame(res,x1,x2))
  res=data$y-mean(data$y) -f2 
  #d)
  fit2 = loess(res~x1, data=data.frame(res,x1,x2))
  f1=predict(fit2,newdata=data.frame(res,x1,x2))
  res=data$y - mean(data$y)-f1

  TSR=sum((data$y-mean(data$y)-f1-f2)^2);TSR
  if (abs(TSR-TSR0) > delta) TSR0=TSR else break
  #continue 
  if (abs(TSR-TSR0) < delta) break
  TSR0=TSR
  val=TSR-TSR0;val
  x11(); plot(x1,f1); plot(x2,f2)
}

为了重现,这里是创建的数据:
set.seed(3)
x1=runif(300);x2=runif(300)
error=rnorm(300,mean=0,sd=3)
z1=-2+3*x1; z2=2*sin(2*pi*x2) 
data=data.frame(x1,x2,y=z1+z2+error) 
#fit the model
TSR0=0
f10=0;f20=0
res=data$y-mean(data$y) -f10 -f20;
delta=.0001

最佳答案

令人困惑的是,当您仅将名称作为语句执行时(例如在您的语句 TSR 中),它通常会将该对象的值打印到控制台。但是,在循环内,此默认打印被抑制。您需要使用 print(TSR) 明确打印它.

我们可以在一个更简单的例子中看到这种行为。先试试这个

for (i in 1:100) i 

然后试试这个
for (i in 1:100) print(i)

这解释了为什么您看不到任何打印内容。但是为什么没有剧情呢?因为循环在 break 上退出在到达那里之前。这将始终发生,因为您第一次设置 TSR0 = TSR , 那么如果 TSR - TSR0 就会中断(根据定义现在等于零)小于 delta。我认为你需要设置 TSR0 = TSR只有在测试它们之间的差异之后,而不是之前。

关于R for 循环 n 次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47361434/

相关文章:

r - R中的外部包

javascript - 列表迭代器中的无限循环

c++ - 在 for 循环中使用 break

javascript - 如何通过 for 循环、mr[2] 和 test1[2] 添加 onclick

r - packrat 包的替代品 - 包的可重复性

r - "could not find function"仅在 R 调试器中时

r - 基于 xts 对象的购买填充保留

matlab - 如何在 Octave 中平滑?

r - 黄土拟合和结果方程

r - loess 和 lofit 有什么不同?