これらは、明示的なループなしで実行できるタスクです。したがって、いくつかの点に注意してください: 3 x 15 x 2000 の乱数を生成する場合も、それらを一度に生成する場合も同じです。彼らはまだ同じディストリビューションを共有しています。
次: 各ループ内でシードを設定すると、シミュレーションが確定的になります。スクリプトの開始時にset.seed
1 回呼び出します。
したがって、すべての乱数を一度に生成し、3 のグループの二乗ノルムを計算してから、15 のグループを作成します。
最初にいくつかの変数定義:
set.seed(20131301)
repetitions <- 2000
numperval <- 3
numpergroup <- 15
miu <- 0
sd1 <- 1
sd2 <- 1
2 つのグループが必要なため、グループ生成をカスタム関数にラップします。これは必須ではありませんが、コードを読みやすくきれいに保つのに少し役立ちます。
generateGroup <- function(repetitions, numperval, numpergroup, m, s) {
# Generate all data
data <- rnorm(repetitions*numperval*numpergroup, m, s)
# Build groups of 3:
data <- matrix(data, ncol=numperval)
# And generate the squared norm of those
data <- rowSums(data*data)
# Finally build a matrix with 15 columns, each column one dataset of numbers, each row one repetition
matrix(data, ncol=numpergroup)
}
これで、グループの乱数を生成できます。
group1 <- generateGroup(repetitions, numperval, numpergroup, miu, sd1)
group2 <- generateGroup(repetitions, numperval, numpergroup, miu, sd2)
トリムされた平均を計算するために、再び を使用しapply
ます。
trimmedmeans_group1 <- apply(group1, 1, mean, trim=0.25)
trimmedmeans_group2 <- apply(group2, 1, mean, trim=0.25)
並べ替え、破棄、平均の計算の代わりに引数を使用mean
しました。trim
ソートされた数値が明示的に必要な場合は、手動で行うことができます (今回は 1 つのグループのみ)。
sorted <- t(apply(group1, 1, sort))
# We have to transpose as apply by default returns a matrix with each observation in one column. I chose the other way around above, so we stick with this convention and transpose.
ここで、最初と最後の 2 つの列を破棄して平均を生成するのは、手動で行うのは簡単です。