0

どうしたらいいかわからないので、ご意見を伺いたいと思います。これは私の紙のプロジェクトの一部に関するものであり、私の状況は次のとおりです。

ステージI

2つのグループがあり、グループごとに次の手順を計算する必要があります。

  1. 正規分布から3つの乱数を生成し、それらを2乗します。
  2. 手順1を15回繰り返すと、最後に15個の乱数が得られます。

私はすでにforループを使用してステージIを実行しました。

n1<-3
n2<-3
miu<-0
sd1<-1
sd2<-1
asim<-15
w<-rep(NA,asim)
x<-rep(NA,asim)
for (i in 1:asim) {
    print(i)
    set.seed(i)

    data1<-rnorm(n1,miu,sd1)
    data2<-rnorm(n2,miu,sd2)

    w[i]<-sum(data1^2)
    x[i]<-sum(data2^2)
}

w
x

第二段階は;

ステージII

グループごとに、次のことを行う必要があります。

  1. グループを並べ替えます。
  2. 各グループのトリム平均を見つけます。

プロセス全体(ステージIとステージII)で、5000回シミュレートする必要があります。ステップ2をどのように進めますか?ステージIIに進むには、別のループを設定する必要があると思いますか?

4

1 に答える 1

2

これらは、明示的なループなしで実行できるタスクです。したがって、いくつかの点に注意してください: 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 つの列を破棄して平均を生成するのは、手動で行うのは簡単です。

于 2013-01-13T07:50:01.460 に答える