0

この質問は、私がここで作成した前の質問と似ています。行からランダムに値を合計し、Rの2つの列に割り当てます。

私はRに問題があるので、この質問はプログラミングと統計の両方に関するものです。私は両方に非常に新しいです。

1つの列に219件の件名があるdata.frameがあります。残りの列は7で、各行には、実験の2つの条件にさらされたときの特定の被験者の応答時間の違いを表す数値があります。

これはデータがどのように見えるかです(私はhead関数を使用しています、そうでなければ長すぎます):

    > head(RTsdiff)
      subject   block3diff   block4diff   block5diff   block6diff   block7diff
    1   40002  0.076961798  0.046067460 -0.027012048  0.017920261  0.002660317
    2   40004  0.037558511 -0.016535211 -0.044306743 -0.011541667  0.044422892
    3   40006 -0.017063123 -0.031156150 -0.084003876 -0.070227149 -0.113382784
    4   40008 -0.015204017 -0.009954545 -0.004082353  0.006327839  0.022335271
    5   40009  0.006055829 -0.045376437 -0.002725572  0.016443182  0.032848128
    6   40010 -0.003017857 -0.034398268 -0.034476491  0.014158824 -0.036592982
       block8diff    block9dif
    1  0.03652273  0.037306173
    2 -0.08032784 -0.150682051
    3 -0.09724864 -0.060338684
    4 -0.04783333  0.006539326 
    5 -0.01459465 -0.067916667
    6 -0.01868126 -0.034409584

私が必要としているのは、すべてのサブジェクト(つまり、すべての行)に対して、3つまたは4つの値をサンプリングし、それらを平均して、新しいベクトル(half1と呼ばれる)に追加するコードです。ベクトルhalf2は、最初の試行でサンプリングされなかった値の平均を持っている必要があります。

したがって、作成したいdata.frameが「RTshalves」と呼ばれるとすると、最初の列はRTsdiffのサブジェクトの同じ列である必要があり、2番目の列は最初の行にランダムに選択された値の平均を持っている必要があります。最初の被験者に対応し、2番目の列には、最初のサンプリングで選択されなかった最初の被験者の値の平均が含まれている必要があります。列2と3の2行目は同じ情報である必要がありますが、今回はサブジェクト2(私のdata.frameのサブジェクト40004)などで、219件のサブジェクトに到達するまで続きます。

最初のサンプルがサブジェクト1の3つの値(block3diff、block5diff、block9diff)をランダムに選択したため、block4diff、block6diff、block7diff、block8diffの値が自動的に残りの半分に対応するとします。次に、(219行の最初の行のみを考慮して)私が期待するものは次のとおりです。

   Subject     Half1       Half2 
    40002   0.02908531   0.02579269

誰かがこの背後にある統計に興味があるなら、私はテストの一貫性をチェックするために半分に分割された信頼性テストをしようとしています。理論的根拠は、RT平均の差が効果の信頼できる推定量である場合、1人の参加者のブロックの半分の差をブロックの残りの半分の差と相関させる必要があるということです。

ヘルプは大歓迎です。前もって感謝します。

4

1 に答える 1

1

half1は簡単です。各行(ベクトルとして取り込まれる)に対して実行する独自の関数を記述しapplyてから、行に対して実行します。

eachrow <- function(x) {
   mean(sample(x,2))
}
RTsdiff$half1 <- apply(eachrow,1,RTsdiff)

half2を取得するには、おそらく同時に実行する必要があります。 ddplyこれには最も簡単な場合があります(by引数を各行を取得するためのサブジェクト変数とします)。このような:

RTsdiff <- data.frame(subject=seq(6))
RTsdiff <- cbind( RTsdiff, matrix(runif(6*8),ncol=8) )

library(plyr)
eachrow <- function(x,n=3) {
  x <- as.numeric(x[,2:ncol(x)]) # eliminate the ID column to make things easier, make a vector
  s <- seq(length(x))
  ones <- sample(s,n) # get ids for half1
  twos <- !(s %in% ones) # get ids for half2
  data.frame( half1=mean(x[ones]), half2=mean(x[twos]) )
}
ddply( RTsdiff, .(subject), eachrow)

  subject     half1     half2
1       1 0.4700982 0.5350610
2       2 0.6173469 0.5351995
3       3 0.2245246 0.6807482
4       4 0.6330649 0.6316353
5       5 0.6388060 0.6629077
6       6 0.4652086 0.5073034

これを行うには、もっとエレガントな方法がたくさんあります。特に、ddplydata.framesを簡単に出力できるので、関数と関数の両方half1を出力half2して、最後にうまく組み合わせることができましたが、ddplydata.framesを入力として受け取るため、少し手間がかかります。最初にベクトルに出力します。転置されたdata.framesapplyのフィードはおそらくもっと簡単でしょう。

于 2012-06-11T13:00:58.617 に答える