HOWTO · R

R の replicate() 関数

このチュートリアルでは、R の replicate() 関数の使用法を紹介します。

このページの内容

Rのreplicate()は式を繰り返し評価し、その結果をまとめて返します。同じ計算、乱数の生成、シミュレーションを複数回実行するときに便利です。式の結果とsimplify引数によって、まとめた値はベクトル、行列、配列、またはリストになります。

replicate() が繰り返す処理

最初の引数nは評価回数を指定します。2番目の引数exprは、繰り返しのたびに1回評価されます。たとえば、次のコードはスカラー値1を5つ返します。

次の例を実行します。

このセクションのコードと表示されるラベルや出力は英語のままです。

result <- replicate(5, 1)
print(result)

返されるベクトルには、評価ごとに1つの値が入ります。exprに乱数を使う場合、評価のたびに異なる値になることがあります。replicate()は結果をまとめますが、それらを同じ値にするわけではありません。

構文とsimplify引数

基本形はreplicate(n, expr, simplify = "array")です。nは繰り返し回数、exprは評価する式、simplifyは集めた結果をRがどのように単純化するかを指定します。既定値の"array"では、結果の形に応じて値が単純化されます。スカラーの結果はベクトルに、長さが等しいベクトルは行列に、さらに高次元の結果は配列になることがあります。各回の結果を別々のオブジェクトとして保持したい場合などは、simplify = FALSEを指定するとリストになります。

次の例を実行します。

このセクションのコードと表示されるラベルや出力は英語のままです。

values <- replicate(3, c("red", "blue"), simplify = FALSE)
print(typeof(values))
print(length(values))
[1] "list"
[1] 3

typeof()は内部の型を示し、length()はリストの要素数を数えます。

スカラーまたはベクトルを繰り返す

スカラーを返す式では、繰り返しごとに1つの結果が得られます。式が毎回同じ長さのベクトルを返す場合、replicate()は各ベクトルを行列の1列に配置します。そのため、行はベクトル内の位置に対応し、列は繰り返し回数に対応します。

次の例を実行します。

このセクションのコードと表示されるラベルや出力は英語のままです。

result <- replicate(3, seq(1, 4))
print(result)

固定長のベクトルを返す計算にも、同じ方法を使えます。結果の長さが一定でない場合、値を規則的な行列に並べることはできません。そのときはsimplify = FALSEを指定し、各結果をリストの要素として保持します。

replicate()とfor()ループを使う

for()ループで値を作り、その値を各繰り返しの結果にできます。式の中でベクトルを初期化して値を格納し、最後にそのベクトルを式の値として返します。

次の例を実行します。

このセクションのコードと表示されるラベルや出力は英語のままです。

result <- replicate(2, {
  values <- numeric(4)
  for (i in seq_len(4)) {
    values[i] <- i * 2
  }
  values
})
print(result)

最後に評価される式はvaluesです。そのため、各評価で完成したベクトルが返され、単純化された結果では繰り返しごとに1列ができます。for()ループ自体が返すのはNULLです。ループ内で値を表示しても、その表示内容がループの戻り値になるわけではありません。繰り返す式がそのようなループだけで構成されている場合、各回の結果はNULLになります。結果に値を含めるには、値を保存し、その保存先のオブジェクトを返します。

乱数シミュレーションを繰り返す

乱数を使う式は、繰り返しのたびに新たに評価されます。たとえば、rnorm(4)は標準正規分布から4つの値を生成します。結果の行列では、4つの値を生成した各回が1列になります。生成される数値は実行ごとに変わるため、固定の出力として扱わないでください。

次の例を実行します。

このセクションのコードと表示されるラベルや出力は英語のままです。

set.seed(42)
draws <- replicate(3, rnorm(4))
print(dim(draws))

シミュレーション関数も繰り返し実行できます。関心のある統計量や測定値を返すように関数を定義し、その関数呼び出しをexprとして渡します。たとえば、runif(1)で値を1つ生成する関数を何度も評価すれば、生成値の分布を調べられます。乱数列を再現可能にする必要がある場合は、シードを選んで記録します。固定したシードがなければ、値は通常、実行のたびに異なります。

replicate()によるブートストラップ再標本化

ブートストラップ再標本化では、観測データから復元抽出して標本を作り、不確実性を近似します。各繰り返しでsample()が再標本化したデータセットを1つ作ります。各標本のサイズが元データと同じなら、単純化された出力は行列になり、各列がブートストラップ反復に対応します。

次の例を実行します。

このセクションのコードと表示されるラベルや出力は英語のままです。

original_data <- c(2, 4, 6, 8, 10)
set.seed(42)
resamples <- replicate(5, sample(original_data, replace = TRUE))
print(dim(resamples))

各列は再標本化されたデータセット1つを表します。復元抽出なので、同じ値が複数回現れることがあります。抽出した値をすべて保持するのではなく統計量をブートストラップするには、たとえばmean(sample(original_data, replace = TRUE))のように、繰り返す式の中で統計量を計算します。この場合、繰り返しごとに統計量が1つ得られ、通常はベクトルにまとめられます。