0

複数の被験者について繰り返し観測を測定した時系列データがあります。positive == 1被験者ごとに変数が発生する回数を計算したいと思います(変数id)。

2 番目の目的は、これらの連続観測の実行の最大長を特定することですpositive == 1。各被験者について、研究期間内に複数回実行される可能性があります。被験者ごとに連続した肯定的な観察の最大数を計算するのではなく、個々の実行の最大実行長を計算したいと思います。

問題を説明するおもちゃのデータセットを次に示します。

set.seed(1234)
test <- data.frame(id = rep(1:3, each = 10), positive = round(runif(30,0,1)))
test$run <- sequence(rle(test$positive)$lengths)
test$run_positive <- ifelse(test$positive == '0', '0', test$run)
test$episode <- ifelse(test$run_positive == '1', '1', '0')

count(test$episode)
  x freq
1 0   25
2 1    5

上記のコードは、肯定的なエピソードの数を数えようとしている最初の質問への回答に近づいていますが、件名によって条件付けられていません。これは、被験者 #1 の最後の観測と被験者 #2 の最初の観測を同じ実行でカウントするという残念な結果をもたらします。サブジェクトごとにこのランレングスのエンコーディングを調整するコードを開発するのを手伝ってくれる人はいますか?

第二に、各ランの最大ラン長のみをどのように抽出できpositive == 1ますか? 最大ランレングスが記録された観測のみが記録される追加の列を追加したいと思います。サブジェクト #1 の場合、これは次のようになります。

   id positive run run_positive episode max_run
1   1        0   1            0       0       0
2   1        1   1            1       1       0
3   1        1   2            2       0       0
4   1        1   3            3       0       0
5   1        1   4            4       0       0
6   1        1   5            5       0       5
7   1        0   1            0       0       0
8   1        0   2            0       0       0
9   1        1   1            1       1       0
10  1        1   2            2       0       2

誰かがこれを行う方法を思い付くことができれば、私は非常に感謝しています.

4

1 に答える 1

1

これはあなたの最初の質問に答えると思います:

aggregate(positive ~ id, data = test, FUN = sum)

  id positive
1  1        7
2  2        4
3  3        4

これはあなたの 2 番目の質問に答えるかもしれませんが、それぞれの目的の結果idを確認して確認する必要があります。

set.seed(1234)
test <- data.frame(id = rep(1:3, each = 10), positive = round(runif(30,0,1)))
test$run <- sequence(rle(test$positive)$lengths)
test$run_positive <- ifelse(test$positive == '0', '0', test$run)
test$episode <- ifelse(test$run_positive == '1', '1', '0')

test$group <- paste(test$id*10, test$positive, sep='')

my.seq <- data.frame(rle(test$group)$lengths)
test$first <- unlist(apply(my.seq, 1, function(x) seq(1,x)))
test$last  <- unlist(apply(my.seq, 1, function(x) seq(x,1,-1)))

test$max <- ifelse(test$last == 1 & test$positive==1, test$run, 0)
test

   id positive run run_positive episode group first last max
1   1        0   1            0       0   100     1    1   0
2   1        1   1            1       1   101     1    5   0
3   1        1   2            2       0   101     2    4   0
4   1        1   3            3       0   101     3    3   0
5   1        1   4            4       0   101     4    2   0
6   1        1   5            5       0   101     5    1   5
7   1        0   1            0       0   100     1    2   0
8   1        0   2            0       0   100     2    1   0
9   1        1   1            1       1   101     1    2   0
10  1        1   2            2       0   101     2    1   2
11  2        1   3            3       0   201     1    2   0
12  2        1   4            4       0   201     2    1   4
13  2        0   1            0       0   200     1    1   0
14  2        1   1            1       1   201     1    1   1
15  2        0   1            0       0   200     1    1   0
16  2        1   1            1       1   201     1    1   1
17  2        0   1            0       0   200     1    4   0
18  2        0   2            0       0   200     2    3   0
19  2        0   3            0       0   200     3    2   0
20  2        0   4            0       0   200     4    1   0
21  3        0   5            0       0   300     1    5   0
22  3        0   6            0       0   300     2    4   0
23  3        0   7            0       0   300     3    3   0
24  3        0   8            0       0   300     4    2   0
25  3        0   9            0       0   300     5    1   0
26  3        1   1            1       1   301     1    4   0
27  3        1   2            2       0   301     2    3   0
28  3        1   3            3       0   301     3    2   0
29  3        1   4            4       0   301     4    1   4
30  3        0   1            0       0   300     1    1   0
于 2013-09-07T02:49:57.897 に答える