5

Rコードのループの構造・考え方を教えてください。この宿題の問題をどこから始めればよいかわかりません。必要な指数分布を作成できました

> rexp(n=200, rate=0.5) 

しかし、今度はこの rexp のサンプルを 2,000 個作成し、各サンプルの平均を計算する必要があります。次に、2,000 個のサンプル平均の平均と分散を計算する必要があります。mean(rexp)私は単純な分布 (例:と)の平均と分散を見つける方法を知っているvar(rexp)ので、私の主な問題は、このループの概念を理解し、それを実行に移すことです。

だから私は入力から始めました:

> rexp(n=200,rate=0.5)

次に、この指数分布に次の名前を付けました。

> exdi = rexp(n=200,rate=0.5)

合計を扱う例に基づいて、私は入力しました

>y.exdi=vector(length=2000)
>for(i in 1:2000){y.exdi[ i ]=mean(exdi)}

R ワークスペースはこれに応答しなかったため、関数に名前を付けてこれを試しました。

>Twothou = for(i in 1:2000){y.exdi[ i ]=mean(exdi)}
>mean(Twothou)

しかし、その後、次のエラー メッセージが表示されました。

[1] NA
Warning message:
In mean.default(Twothou) : argument is not numeric or logical: returning NA

どうすればいいですか?

4

5 に答える 5

6

同じ値の 2000 要素の本当に素晴らしいベクトルを作成しました - 指数分布のために一度だけ抽出されたサンプルの平均値です。y.exdiコンソールで確認してください。

このソリューションにループを使用する場合は、反復ごとに新しいサンプルと新しいサンプルを作成する必要があります。たとえば、(ループsapplyのラッパー)を次のように適用すると、簡単に実行できます。for1:2000

sapply(1:2000, function(x) mean(rexp(n = 200, rate = 0.5)))

または、直接例を呼び出しreplicateます(そのような場合に使用することを目的としていました):

replicate(2000, mean(rexp(n = 200, rate = 0.5)))
于 2013-10-15T22:31:10.937 に答える
3

乱数ジェネレーターをループ内に配置する必要があると思いますrexp for

y.exdi=vector(length=2000)
for(i in 1:2000){
    y.exdi[ i ]=mean(rexp(n=200,rate=0.5))
}

それ以外の場合は、インデックスが増加iするたびに生成される新しいベクトルではなく、ループの外側で定義された固定ベクトルの平均を計算するだけです。i上記のコードを使用すると、 を使用して平均を計算できますmean(y.exdi)。これにより、2000 の「平均」の平均が得られます。

于 2013-10-15T22:28:00.307 に答える
2

ループ内でサンプル配布を作成する必要があります。これを試して:

> set.seed(1)
> y.exdi=vector(length=2000)
> for(i in 1:2000){
+ exdi = rexp(n=200,rate=0.5)
+ y.exdi[ i ]=mean(exdi)
+ }
> mean(y.exdi)
[1] 2.001149
> var(y.exdi)
[1] 0.01987367
于 2013-10-15T22:28:56.270 に答える
2

サンプルを 2000 回生成する必要があるため、サンプル生成はループ内にある必要があります。

set.seed(1)
y.exdi <- vector(length=2000, "numeric")
for (i in 1:2000)
{
    y.exdi[i] <- mean(rexp(200, 0.5))
}

問題はコマンドにもあります

   exdi = rexp(n=200,rate=0.5)

exdi実際に200個の指数分布のランダムに生成された値の数値ベクトルに割り当てている場合、関数は定義されていません。実際には、関数を再定義する必要はなく、rexp毎回呼び出すことができます。

R は、これらのタイプのショートカットも提供します。ワンライナーで2000の手段を得ることができます

sapply(1:2000, function(x) { mean(rexp(200, 0.5)) })
于 2013-10-15T22:29:32.440 に答える
0

ここに2つの解決策があります。1 つ目はサンプルを 2 回作成する必要はありませんが、無名関数とそのリストの戻り値は奇妙です。2 つ目はよりクリーンです。列名は取得できますが、同じサンプルの分散に関連付けられた平均値はもうありません。

library(plyr)

ldply(1:2000, function(x) {d <- rexp(n = 200, rate = 0.5); c(mean(d), var(d))})

ddply(data.frame(x = 1:2000), .(x), summarize, 
  mean = mean(rexp(n = 200, rate = 0.5)), var = var(rexp(n = 200, rate = 0.5)))

あなたのソリューションは、値を y.exdi リストに入れます。構築時にその内容を見ると、ブール値の FALSE 値でいっぱいになります。ループの後、それを再検査して、その要素として平均があることを確認できます。いくつかのクリーンアップを行って、ループで実行しようとしていたことを完了するための 2 つの等しく有効な方法を次に示します。

y.exdi <- NULL
for(i in 1:2000) y.exdi[i] <- mean(rexp(n = 200, rate = 0.5))

y.exdi <- vector(length = 2000, mode = "numeric")
for(i in seq(y.exdi)) y.exdi[i] <- mean(rexp(n = 200, rate = 0.5))
于 2013-10-16T01:38:55.597 に答える