2017-03-31 9 views
0

私はRを学んでいて、私の最初のfor-loopを書いています。 1000回の反復では、それぞれ10,100,1000、および10000の要素を持つ4つのベクトルを作成します。これらのいわゆるシータ1値は認識されません。私はその時点で1つのtheta1を実行しようとしたが動作しますが、すべての4を実行するとエラー 'オブジェクトが見つかりません'が返されます。何が間違っているのかは分かりませんが、誰でも説明できますか?For R in returnエラー 'object not found'

k=1000 

'Method1' 

for(i in 1:k){ 
    N10=runif(10) 
    N100=runif(100) 
    N1000=runif(1000) 
    N10000=runif(10000) 
    theta1_10[i]=(1/10)*4*sum(sqrt(1-N10^2)) 
    theta1_100[i]=(1/100)*4*sum(sqrt(1-N100^2)) 
    theta1_1000[i]=(1/1000)*4*sum(sqrt(1-N1000^2)) 
    theta1_10000[i]=(1/10000)*4*sum(sqrt(1-N10000^2)) 
} 

'Result Method 1' 
m_theta1_10 = mean(theta1_10) 
sd_theta1_10 = sd(theta1_10) 
m_theta1_100 = mean(theta1_100) 
sd_theta1_100 = sd(theta1_100) 
m_theta1_1000 = mean(theta1_1000) 
sd_theta1_1000 = sd(theta1_1000) 
m_theta1_10000 = mean(theta1_10000) 
sd_theta1_10000 = sd(theta1_10000) 
+0

' '1'の方法は何ですか?あなたは 'vba'でコーディングしていません。あなたがコメントをしたいのであれば、代わりに '#'を使用してください!しかしそれはあなたの問題ではありません。 – Masoud

+2

fortaの前に 'theta1_10'を' theta1_100000'に初期化する必要があります。たとえば、 'theta1_10 = vector(、k)' – TooYoung

+1

[新しい項目を追加するために空のRベクトルを作成する方法]の複製が可能です(http://stackoverflow.com/questions/3413879/how-to-create-an-empty -r-vector-to-new-items) – vincentmajor

答えて

1

値を割り当てる前にベクトルを初期化する必要があります。 このケースでは、それは次のとおりです。

# Initialize 
k=1000 
theta1_10 = vector(,k) 
theta1_100 = vector(,k) 
theta1_1000 = vector(,k) 
theta1_10000 = vector(,k) 

# Method1 
for(i in 1:k){ 
    N10=runif(10) 
    N100=runif(100) 
    N1000=runif(1000) 
    N10000=runif(10000) 
    theta1_10[k] = (1/10)*4*sum(sqrt(1-N10^2)) 
    theta1_100[k] = (1/100)*4*sum(sqrt(1-N100^2)) 
    theta1_1000[k] = (1/1000)*4*sum(sqrt(1-N1000^2)) 
    theta1_10000[k] = (1/10000)*4*sum(sqrt(1-N10000^2)) 
} 

# Result Method 1 
result = data.frame(mean = c(mean(theta1_10),mean(theta1_100),mean(theta1_1000),mean(theta1_10000)), 
        sd = c(sd(theta1_10),sd(theta1_100),sd(theta1_1000),sd(theta1_10000))) 
rownames(result) <- c("theta1_10","theta1_100","theta1_1000","theta1_10000") 
result 

       mean   sd 
theta1_10 3.145259 0.287263626 
theta1_100 3.142640 0.089207786 
theta1_1000 3.140476 0.027901399 
theta1_10000 3.141695 0.009046627 
+0

ありがとうございました。より良く理解するために、theta1_10 = c(theta1_10、(1/10)* 4 * sum(sqrt(1-N10^2)))のtheta1_10はベクトルtheta1_10に追加されていますか? – Orongo

+0

はい、 'c(theta1_10、....)'は、 'theta1_10'に次の行を追加することを意味します。 Uweブロックが指摘するように、kが大きいときは良い考えではありません。 – TooYoung

1

私はこの答えを書いて質問し、受け入れ答えの両方がRに悪いプログラミングスタイルを発揮するので:彼らはループのためのベクトルを拡大しています。 (円2Patrick Burns' The R Infernoを参照してください。)

この効果は簡単なベンチマークから明らかになるでしょう。タスクは、kに整数1を含有するベクターxを作成することである。

k <- 10000L 
microbenchmark::microbenchmark(
    grow = { 
    x <- integer(0) 
    for (i in seq.int(k)) x <- c(x, i) 
    x 
    }, 
    subscript = { 
    x <- integer(k) 
    for (i in seq.int(k)) x[i] <- i 
    x 
    }, 
    colon_operator = { 
    x <- 1L:k 
    x 
    }, 
    times = 10L 
) 
#Unit: microseconds 
#   expr  min  lq  mean median  uq  max neval 
#   grow 93491.676 96127.568 104219.0140 97123.627 99459.343 165545.063 10 
#  subscript 9067.607 9215.996 9483.0962 9551.288 9771.795 9938.307 10 
# colon_operator  5.664  7.552  7.9675  8.307  8.685  9.063 10 

それも、長さ10000の小さなベクトルのための要素を付加することは明らかだ予め必要な長さを割り当てるよりも遅い大きさです。組み込みのベクトル化された関数の利点を示すために、コロン演算子のタイミングをここに含めます。

したがって、効率を向上させるために問題の両方のコードとanswerを書き直す必要があります。

しかし、全体のコードははるかに簡潔な方法で再記述することができ
# initialize the random number generator for reproducible results 
set.seed(1234L) 
# allocate memory for the vectors beforehand 
theta1_10 = numeric(k) 
theta1_100 = numeric(k) 
theta1_1000 = numeric(k) 
theta1_10000 = numeric(k) 

# Method1 
for(i in seq.int(k)){ 
    N10=runif(10) 
    N100=runif(100) 
    N1000=runif(1000) 
    N10000=runif(10000) 
    # update by subscripting 
    theta1_10[i] = (1/10)*4*sum(sqrt(1-N10^2)) 
    theta1_100[i] = (1/100)*4*sum(sqrt(1-N100^2)) 
    theta1_1000[i] = (1/1000)*4*sum(sqrt(1-N1000^2)) 
    theta1_10000[i] = (1/10000)*4*sum(sqrt(1-N10000^2)) 
} 

library(data.table) 
set.seed(1234) 
k <- 1000L 
N <- 10^(1:4) 
rbindlist(
    lapply(N, function(i) { 
    theta1 <- replicate(k, 4/i * sum(sqrt(1 - runif(i)^2))) 
    data.table(N = i, mean = mean(theta1), sd = sd(theta1)) 
    })) 
#  N  mean   sd 
#1: 10 3.144974 0.27238683 
#2: 100 3.140716 0.09040696 
#3: 1000 3.141791 0.02654225 
#4: 10000 3.141585 0.00886737 
関連する問題