2017-11-18 133 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只有測試他們之間的差異,而不是之前。