2012-09-22 52 views
-1

我仍在學習R,並且遇到問題編寫和讀取f中的文件。 我想要做的是檢索什麼迭代我獲得共線性當我重新採樣並保存到一個向量然後。在第二個代碼中使用這個向量來忽略這些迭代並進入下一次迭代。將r輸出寫入r對象並在下一個代碼中使用

我在我的代碼中有幾個錯誤,你幫忙請給我更好的方法來做到這一點。但請記住我需要將iter矢量保存到文件中,以便稍後使用它。

下面是代碼:

a0=rep(1,40) 
a=rep(0:1,20) 
b=c(rep(1,20),rep(0,20)) 
c0=c(rep(0,12),rep(1,28)) 
c1=c(rep(1,5),rep(0,35)) 
c2=c(rep(1,8),rep(0,32)) 
c3=c(rep(1,23),rep(0,17)) 
c4=c(rep(1,6),rep(0,34)) 
x=matrix(cbind(a0,a,b,c0,c1,c2,c3,c4),nrow=40,ncol=8) 

sam <- function(n){ 
iterlist <- NULL 
for(i in 1:n){ 
set.seed(i) 
indx <- sample(1:nrow(x),nrow(x),replace=T) 
samx <- x[indx,] 
e <- crossprod(samx) 
ee <- eigen(e) 
evals <- ee$values 
Zeval <- which(ifelse(abs(evals)<=1e-7,TRUE,FALSE)) 
if(length(Zeval)!=0) iterlist <- c(iterlist,i) 
} 
return(iterlist) 
} 
iter <- sam(20) 
setwd("C:/Users/Sam/Desktop/R") 
writeLines(iter) 
readLines(iter) 
fit <- function(dat,n){ 
for(i in 1:n){ 
if(i==iter) next 
set.seed(i) 
indx <- sample(1:nrow(x),nrow(x),replace=T) 
samx <- x[indx,] 
fit <- lm(rnorm(nrow(x),i,2*i)~samx-1) 
bhat <- coef(fit) 
} 
return(bhat) 
} 
fit(x,20) 

謝謝

回答

2

你爲什麼不只是結合你的兩個功能合爲一體,從而避免重複相同的代碼?那樣你就不必寫出任何東西,讀回來,或者做一堆其他的房子清潔用品?

也有在您的fit()功能的錯誤在這條線的代碼norm(20,i,2*i)

  1. norm只需要兩個參數,首先是一個數值矩陣並指定矩陣的類型是第二字符向量
  2. 也許你的意思是rnorm()而不是?如果是這樣的話 - 那裏,因爲你創建20周隨機數而samx有40

的長度仍然是一個錯誤,我不知道你真正想要做的,因爲你沒有告訴我們,所以我將留給你來適當修復。

最後 - 這是我如何將你的兩個函數改寫爲一個。我也重寫了它們以使用*apply函數而不是for循環。通過迭代製作更大的對象,您可以使R爬行速度非常快。然後你會回來抱怨性能不佳,所以不要在第一時間迭代增加對象!要麼預先分配存儲矢量,要麼像我這樣使用*apply函數。

sam <- function(i){ 
    set.seed(i) 
    indx <- sample(1:nrow(x),nrow(x),replace=T) 
    samx <- x[indx,] 
    e <- crossprod(samx) 
    ee <- eigen(e) 
    evals <- ee$values 
    Zeval <- which(ifelse(abs(evals)<=1e-7,TRUE,FALSE)) 
    if(length(Zeval)==0) { 
     fit <- lm(norm(nrow(samx),i,2*i)~samx-1) #Note the assumption I had to make here 
     bhat <- coef(fit) 
    } else { 
     bhat <- NA 
    } 
    return(list(bhat = bhat, iter = i)) 
} 

而且在使用

> lapply(1:4, sam, 20) 
[[1]] 
[[1]]$bhat 
     samx1  samx2  samx3  samx4  samx5  samx6  samx7 
1.14857203 0.46875434 0.06780226 -0.56521389 -0.81897946 -2.48305129 0.56577183 
     samx8 
2.34547722 

[[1]]$iter 
[1] 1 

... 
... 

[[4]] 
[[4]]$bhat 
[1] NA 

[[4]]$iter 
[1] 4 

還要注意我放棄了n參數從擬合函數,你定義它,但當時也沒在任何地方使用它。

+0

嗨謝謝你的解釋,這是我的壞,我有vvesion問題。我沒有看到我的代碼中的錯誤。 –

+0

嗨謝謝你的解釋,這是我的不好,我有版本問題。我沒有看到我的代碼中的錯誤。另外我注意到lapply中存在錯誤(1:4,sam,20)。首先,我無法將我剛剛創建的函數與我正在嘗試做的相似。所有我需要做的就是保存iterlist向量,這樣我就可以在另一個控制檯或程序中使用矢量了。我創建了一個函數sam來獲取這些不良迭代,所以我試圖避免它們在代碼中的其他地方。你能告訴我如何保存載體,以便我可以使用它嗎?我需要循環,因爲我需要使用下一個 –