5

私は、2 つの変数の合計が実際のデータと同じであるが、各変数のカウントがランダムである偽のデータセットを作成する必要がある状況にあります。セットアップは次のとおりです。

>df
    X.1  X.2
1   145   30
2    55   73   

最初の行の合計は 175、2 番目の行の合計は 128 です。私が探しているのは、次のようなデータ フレーム (またはデータ フレームの束) を生成する方法です。

>df.2
    X.1  X.2
1   100   75
2    90   38

df.2 では、セル数が変更されましたが、行の合計は同じテーブルになります。実際のデータには何百もの行がありますが、それが役立つ場合は変数は 2 つだけです。これを行う方法を見つけようとしましたsample()が、運がありませんでした。助言がありますか?

ありがとう!

4

4 に答える 4

6

おそらくあなたは探していr2dtableますか?

> r2dtable(2, c(175,128), c(190, 113))
[[1]]
     [,1] [,2]
[1,]  108   67
[2,]   82   46

[[2]]
     [,1] [,2]
[1,]  114   61
[2,]   76   52

rmultinomまた、レプリケートを実行してから結果を結合するために使用する @mnel の回答のバージョンをn次に示します。ほんの数回の複製が必要な場合はそれほど重要ではありませんが、それがrmultinomできるので、それがどのように行われるかを見てみたいと思いました.

n <- 10
e <- cbind(X1  = c(100,90,30),X2 = c(75,28,120))
aperm(array(sapply(1:nrow(e), function(i) 
        rmultinom(n, rowSums(e)[i], (e/rowSums(e))[i,])),
      dim=c(ncol(e),n,nrow(e))), c(3,1,2))
于 2012-08-20T01:59:32.737 に答える
5

多項分布からサンプリングしていますが、


編集

事前に指定された予想される細胞数を可能にする

  • 多項分布は、各セルを合計を条件とするポアソン分布 (予想されるセル数を含む) と見なすことができます。

編集2

  • 任意の数の行/予想されるセル数を許可します
  • expected期待される細胞数として合格

rmultinom各列が多項標本である行列を返すことに注意してください。したがって、t単一の行行列を作成するために を使用します

replicates <- 10
expected <- data.frame(X1  = c(100,90,30),X2 = c(75,28,120))
##    X1  X2
## 1 100  75
## 2  90  28
## 3  30 120
data_samples <- lapply(seq(replicates), function(i, expected){
   # create a list of expected cell counts (list element = row of expected)
  .list <- lapply(apply(expected,1,list),unlist)
   # sample from these expected cell counts and recombine into a data.frame
   as.data.frame(do.call(rbind,lapply(.list, function(.x) t(rmultinom(n = 1, prob = .x,  size = sum(.x) )))))
   }, expected = expected)

data.framesこれにより、適切なプロパティを持つリストが作成されます

data_samples[[1]]
##    X1  X2
## 1 104  71
## 2  84  34
## 3  19 131


data_samples[[5]]
##   X1  X2
## 1 88  87
## 2 92  26
## 3 27 123
于 2012-08-20T00:44:07.873 に答える
2

回答に使用するデータ:

test <- data.frame(X.1=c(145,55),X.2=c(30,73))

を使用したバージョンsample:

t(sapply(
        rowSums(test),
        function(x) {
                one <- sample(1:x,1)
                two <- (x - one)
                result <- data.frame(one,two)
                names(result) <- names(test)
                return(result)
                }
         )
)

結果は次のようになります。

     X.1 X.2
[1,] 20  155
[2,] 127 1  

また...

     X.1 X.2
[1,] 111 64 
[2,] 94  34 

等...

または:

最初に数値の 1 つに を少しjitter足してから、行の合計からこれを引きます。

t(apply(
        test,
        1,
        function(x) {
                rsum <- sum(x)
                one <- round(jitter(x[1],20,20),0)
                two <- (rsum - one)
                result <- c(one,two)
                names(result) <- names(test)
                return(result)
                }
    )
)

結果の例:

     X.1 X.2
[1,] 160  15
[2,]  47  81

     X.1 X.2
[1,] 127  48
[2,]  64  64
于 2012-08-20T00:59:35.387 に答える