3

column によって GROUPED BY された 2 つの値のセットを渡すことができるようにしたいと考えていますCategoryddplyfrom packageを使用してこれを行う方法はありますplyrか?

私はこのようなことをしたい:

ddply(idata.frame(data), .(Category), wilcox.test, data[Type=="PRE",], data[Type=="POST",])

wilcox.test次の機能です。

Description

Performs one- and two-sample Wilcoxon tests on vectors of data; the latter is also known as ‘Mann-Whitney’ test.

Usage

wilcox.test(x, ...)

Arguments

x   
numeric vector of data values. Non-finite (e.g. infinite or missing) values will be omitted.

y   
an optional numeric vector of data values: as with x non-finite values will be omitted.

.... rest of the arguments snipped ....

から次の出力がありますdput

structure(list(Category = c("A", "C", 
"B", "C", "D", "E", 
"C", "A", "F", "B", 
"E", "C", "C", "A", 
"C", "A", "B", "H", 
"I", "A"), Type = c("POST", "POST", 
"POST", "POST", "PRE", "POST", "POST", "PRE", "POST", 
"POST", "POST", "POST", "POST", "PRE", "PRE", "POST", 
"POST", "POST", "POST", "POST"), Value = c(1560638113, 
1283621, 561329742, 2727503, 938032, 4233577690, 0, 4209749646, 
111467236, 174667894, 1071501854, 720499, 2195611, 1117814707, 
1181525, 1493315101, 253416809, 327012982, 538595522, 3023339026
)), .Names = c("Category", "Type", "Value"), row.names = c(21406L, 
123351L, 59875L, 45186L, 126720L, 94153L, 48067L, 159371L, 54303L, 
63318L, 104100L, 58162L, 41945L, 159794L, 57757L, 178622L, 83812L, 
130655L, 30860L, 24513L), class = "data.frame")

助言がありますか?

4

2 に答える 2

4

私がいつもしていることは、無名関数を使用することです:

ddply(idata.frame(data), .(Category), 
    function(x) wilcox.test(x[Type == "PRE",], x[Type == "POST",])

関数がデフォルトでwilcox.testに連結するのに適したものを返すかどうかはわかりません。そのため、少し微調整する必要があります。または、出力のリストで終了するためdata.frameに使用します。dlplywilcox.test

于 2013-01-22T19:58:08.067 に答える
2

ここには2つの問題があります。

  1. 私の場合、まったく同じデータを使用していますが、Paulのソリューションは機能していないようです。サブセット化の構文が原因だと思いますが、エラーをクラックすることはできませんでした。

  2. 実際には、データが小さすぎて、使用したい構造(つまり、Categoryx Type)が与えられた場合に統計的検定で計算するには比較できません。結局のところ、データフレーム内のカテゴリの数を見ると、すべての値は30未満であり、半分の値は1つだけです。

    > table(data$Category)
    A B C D E F H I 
    5 3 6 1 2 1 1 1
    

しかし、良いニュースは、私があなたのための解決策を見つけたことです。

まず、より広いテーブルを生成する必要がありました。そして、私は(非常に)怠惰だったので、私は単にこれをしました:

for(i in 1:10){data <- rbind(data,data)}

data$Value <- jitter(data$Value,5e3) 

data$Type <- sample(c("POST","PRE"),size=nrow(data),replace=T,prob=c(0.80,0.20))

表を10回複製し、数値にノイズを追加し、最初のデータフレームに追加したのと同じ比率で「PRE」と「POST」をランダムに再割り当てしました。ここでは、値自体はそれほど重要ではないことに注意してください。私は、あなたが提供したのと同じデータ構造を使用するだけです。

このようにして、テーブルがはるかに大きくなり、さらに重要なことに、テーブルの密度が高くなります。

    > table(data$Category, data$Type)

      POST  PRE
    A 4135  985
    B 2470  602
    C 4881 1263
    D  814  210
    E 1634  414
    F  815  209
    H  846  178
    I  813  211

これで完了です。

これで、解決策を見つけることができます。わかりやすくするために、ウィルコクソン検定を個別に実行する関数を作成しました。秘訣は、出力に必要なデータフレームに組み込まれるベクトルを返さなければならないことです。

関数を呼び出しましょうwx

 wx <- function(d){
 w <- wilcox.test(
  # First vector (x)
    subset(d, Type == "PRE", select = Value )[,1], 
    subset(d, Type == "POST", select = Value )[,1]
      )
  # c(1,3) returns the Stat and the P-value (tweak that if you want something else)
  return(w[c(1,3)])
  }

最後に、関数をデータフレームに適用する必要があります。

> ddply(data, .(Category), .fun = wx  )
    Category      V1        V2
           A 2047794 0.7862484
           B  725554 0.3585648
           C 3071435 0.8459535
           D   80693 0.2112926 
           E  347314 0.3984288
           F   83304 0.6252554
           H   71762 0.3247840
           I   88874 0.4177269

もちろん、私がテーブルを作成した方法を考えると、重要なことは何もありませんが、V1には統計があり、V2にはP値があります。

于 2013-02-14T18:32:42.150 に答える