2013-09-07 4 views
0

Имеются данные временных рядов, в которых повторялись повторные наблюдения по нескольким предметам. Я хотел бы рассчитать количество случаев, в которых переменная positive == 1 возникает для каждого объекта (переменная id).Вычислить длину и максимальную длину прогона по предмету ID

Вторая цель - определить максимальную длину этих серий последовательных наблюдений, в которых 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? Я хотел бы добавить дополнительный столбец, в котором записываются только наблюдения, в которых записывается максимальная длина пробега. Для Subject # 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 

Если кто-то может придумать метод, чтобы сделать это, я был бы очень благодарен.

+0

Я не» t понимайте свою «максимальную длину пробега для каждого прогона». Каждый пробег имеет _one_ length, поэтому «максимум» здесь не имеет смысла. По крайней мере, не для меня. Например, первый запуск для id 1, где положительный = 1 имеет длину 5. В пределах id, в течение прогона для положительного = 1, вы хотите наложить длину выполнения на начальные нули? – Henrik

+0

Для первого вопроса вы можете попробовать 'с (test, table (id, positive))' – Henrik

+0

Извините, если я использовал неправильную терминологию для описания того, что я искал. Вы правы, что я ищу «прокладку» длины пробега с ведущими нулями. Код, который вы указали в вашем примере 'с (test, table (id, positive)), довольно близок. Единственная проблема заключается в том, что он суммирует все прогоны вместе на пациента, тогда как я хотел бы однозначно определить длину прогона для каждого прогона по предмету. Поэтому вместо того, чтобы сообщать, что идентификатор №1 имеет 7 положительных результатов, было бы идеальным сказать, что идентификатор №1 имеет 2 пробега длиной 5 и 2. Затем я хотел бы обернуть этот вывод в 'test' и проложить его с помощью ведущего нули. – Entropy

ответ

0

Я думаю, что это ответ на ваш первый вопрос:

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

    id positive 
1 1  7 
2 2  4 
3 3  4 

Это может ответить на ваш второй вопрос, но я должен был бы увидеть желаемый результат для каждого 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 
+0

Работал блестяще - спасибо! – Entropy

Смежные вопросы