2017-11-18 134 views
3

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

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

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 

回答

3

的困惑是,当你执行只是一个名字的声明(例如,在你的声明TSR)它正常打印的该值对象到控制台。但是,在循环内部,此默认打印被抑制。您需要用print(TSR)明确打印。

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

for (i in 1:100) i 

那就试试这个

for (i in 1:100) print(i) 

这也解释了为什么你看不到任何东西打印出来。但为什么没有情节?因为循环在到达之前在break上退出。这将始终发生,因为你第一次设置TSR0 = TSR,那么你打破,如果TSR - TSR0(现在等于0定义)小于三角洲。我认为你需要设置TSR0 = TSR只有测试他们之间的差异,而不是之前。