-1

私はまだRを学習していて、Rでファイルを読み書きするのに問題があります。私がやろうとしているのは、リサンプリングしてベクトルに保存するときに、共線性を取得している反復で取得することです。2番目のコードでこのベクトルを使用して、これらの反復を無視し、次の反復に進みます。

私のコードにはほとんどエラーがありません。あなたが助けてくれて、これを行うためのより良い方法を教えてください。ただし、後で使用できるように、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)

ありがとうございました

4

1 に答える 1

2

2 つの関数を 1 つにまとめて、同じコードの重複を避けてみませんか? そうすれば、何も書いたり、読み返したり、他の家の掃除をする必要はありませんか?

fit()このコード行の関数にもエラーがありましたnorm(20,i,2*i)

  1. norm最初の引数は数値行列で、2 番目の引数は計算する行列のタイプを指定する文字ベクトルです。
  2. 多分あなたはrnorm()代わりに意味しましたか?その場合samx、長さが 40 であるのに 20 個の乱数を作成するため、まだエラーが発生します。

あなたが私たちに教えてくれなかったので、あなたが本当に何をしようとしているのかわからないので、適切に修正するのはあなたに任せます.

最後に、2 つの関数を 1 つに書き直す方法を次に示します。*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定義したように fit 関数から引数を削除しましたが、どこでも使用しなかったことに注意してください。

于 2012-09-22T14:39:18.283 に答える