-1

約100万回実行されるループでコイントスシミュレーションを実行しています。

ループを実行するたびに、RLEコマンドからのテーブル出力を保持したいと思います。残念ながら、単純な追加は適切ではないようです。ループを実行するたびに、わずかに異なる量のデータが取得されます。これは、問題の1つと思われます。

このコードは、私が何をしているのかを示しています。

N <- 5 #Number of times to run
rlex <-NULL
#begin loop#############################
for (i in 1:N) { #tells R to repeat N number
x <-sample(0:1, 100000, 1/2)
rlex <-append(rlex, rle(x))
}
table(rlex) #doesn't work
table(rle(x)) #only 1

したがって、5つの個別のrle結果(このシミュレーションでは、フルバージョンで100万)を使用する代わりに、1つのマージされたrleテーブルが必要です。これが明確であることを願っています。明らかに、私の実際のコードはもう少し複雑なので、どのソリューションも私が指定したものにできるだけ近いはずです。

更新:ループは絶対的な要件です。ifsまたはbutsはありません。おそらく、table(rle(x))データを取り出して、それを行列に入れることができます。ただし、ここでも障害となるのは、頻度の低いランレングスの一部が各ループで常に表示されるとは限らないという事実です。したがって、ランレングス数に基づいて条件付きでマトリックスを埋めようとしていると思いますか?

諦める前の最後の更新:rle $ valuesを保持すると、保持されるデータが多すぎることを意味します。私のシミュレーションは大規模であり、実際にはrleのテーブル出力のみを保持したいと考えています。各ループの各テーブル(rle(x))を保持し、手動で結合する(数千になります)か、データを保持するプログラム的な方法(0と1の場合はyes)を見つけて、から形成される1つのテーブルを作成します。私が進むにつれて、個々のループのそれぞれをマージします。

指定されているように、これは簡単に実行できるか、または実行しません。それはばかげた考え/要求に見えるかもしれませんが、それができるかどうかに付随するはずです。

真剣に前回。これは、私が何を期待しているのかを示すアニメーションGIFです。ここに画像の説明を入力してください

ループの各反復後、データがテーブルに追加されます。これは私がそれを伝えることができるようになるのと同じくらい明確です。

4

3 に答える 3

7

OK、4番を試してください。

N <- 5
set.seed(1)
x <- NULL
for (i in 1:N){
  x <- rbind(x, table(rle(sample(0:1, 100000, replace=TRUE))))
}

x <- as.data.frame(x)
x$length <- as.numeric(rownames(x))
aggregate(x[, 1:2], list(x[[3]]), sum)

生産:

   Group.1     0     1
1        1 62634 62531
2        2 31410 31577
3        3 15748 15488
4        4  7604  7876
5        5  3912  3845
6        6  1968  1951
7        7   979   971
8        8   498   477
9        9   227   246
10      10   109   128
11      11    65    59
12      12    24    30
13      13    21    11
14      14     7    10
15      15     0     4
16      16     4     2
17      17     0     1
18      18     0     1

ループ内で集計が必要な場合は、次のようにします。

N <- 5
set.seed(1)
x <- NULL
for (i in 1:N){
  x <- rbind(x, table(rle(sample(0:1, 100000, replace=TRUE))))
  y <- aggregate(x, list(as.numeric(rownames(x))), sum)
  print(y)
}
于 2012-10-15T11:42:33.723 に答える
7

@CarlWitthoftの回答をフォローアップすると、おそらく次のようになります。

N <- 5
rlex <-NULL
for (i in 1:N) {
    x <-sample(0:1, 100000, 1/2)
    rlex <-append(rlex, rle(x)$lengths)
}

コンポーネントについては気にしないと思うので$values(つまり、各実行が0または1の実行であるかどうか)。

結果:ランレングスの1つの長いベクトル。

しかし、これはおそらくはるかに効率的です:

maxlen <- 30
rlemat <- matrix(nrow=N,ncol=maxlen)
for (i in 1:N) { 
    x <-sample(0:1, 100000, 1/2)
    rlemat[i,] <- table(factor(rle(x)$lengths,levels=1:maxlen))
}

結果:各反復からの実行長のNbyテーブル。maxlen

各長さの実行の総数のみを保存したい場合は、次のことを試すことができます。

rlecumsum <- rep(0,maxlen)
for (i in 1:N) { 
    x <-sample(0:1, 100000, 1/2)
    rlecumsum <- rlecumsum + table(factor(rle(x)$lengths,levels=1:maxlen))
}

結果maxlen:すべての反復にわたるランレングスの総数の長さのベクトル。

そして、これが私の最終的な答えです:

rlecumtab <- matrix(0,ncol=2,nrow=maxlen)
for (i in 1:N) { 
   x <- sample(0:1, 100000, 1/2)
   r1 <- rle(x)
   rtab <- table(factor(r1$lengths,levels=1:maxlen),r1$values)
   rlecumtab <- rlecumtab + rtab
}

結果maxlenすべての反復にわたるランレングスの総数をタイプ(0ランと1ラン)で割った2行の表。

于 2012-10-15T13:11:37.197 に答える
6

のヘルプページを読む必要がありますrle。検討:

names(rlex)  #"lengths"  "values"  "lengths"  "values" .... and so on

それまでの間、統計的手法をじっくりと検討することを強くお勧めします。二項シミュレーションを100万回実行すると、コインにp = 1e-5がない限り、数百回試行しても学習できないことがわかる可能性はゼロ(+/-イプシロン)です:-)。

于 2012-10-15T11:39:34.367 に答える