Продольное сравнение значений в R с изюминкой

У меня есть результаты теста, проведенного несколькими людьми в целых четыре периода времени. Вот пример:

dat <- structure(list(Participant_ID = c("A", "A", "A", "A", "B", "B", 
"B", "B", "C", "C", "C", "C"), phase = structure(c(1L, 2L, 3L, 
4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L), .Label = c("base", "sixmos", 
"twelvemos", "eighteenmos"), class = "factor"), result = c("Negative", 
"Negative", "Negative", "Negative", "Negative", "Positive", "Negative", 
NA, "Positive", "Indeterminate", "Negative", "Negative")), .Names = c("Participant_ID", 
"phase", "result"), row.names = c(1L, 2L, 3L, 4L, 97L, 98L, 99L, 
100L, 9L, 10L, 11L, 12L), class = c("cast_df", "data.frame"))

который выглядит так:

    Participant_ID       phase        result
1                A        base      Negative
2                A      sixmos      Negative
3                A   twelvemos      Negative
4                A eighteenmos      Negative
97               B        base      Negative
98               B      sixmos      Positive
99               B   twelvemos      Negative
100              B eighteenmos          <NA>
9                C        base      Positive
10               C      sixmos Indeterminate
11               C   twelvemos      Negative
12               C eighteenmos      Negative

Я хотел бы добавить идентификатор к каждому тесту, чтобы отметить, был ли этот тест преобразованием из предыдущего статуса (отрицательного в положительный), возвратом (положительным в отрицательный) или стабильным. Подвох в том, что я не просто сравниваю базовый тест с тестом на шесть месяцев, шесть месяцев с тестом на двенадцать месяцев и т. д. — в таких случаях, как C, тест sixmos должен быть помечен как стабильный или неубедительный (точный термин для этого — неоднозначный), и (что более важно) тест двенадцатимосов затем следует сравнить с базовым тестом и пометить как реверсию. И наоборот, если у кого-то была последовательность «Отрицательный», «Неопределенный», «Отрицательный», она должна быть стабильной.

Это последняя часть, на которой я застрял; если бы это была просто последовательность сравнений для каждого участника, все было бы в порядке, но я не могу придумать, как элегантно справиться с этими парами сравнения переменных. Ваша помощь, как всегда, очень ценится.


person Matt Parker    schedule 07.05.2010    source источник


Ответы (1)


Я не думаю, что вы обрисовали в общих чертах, что должно происходить во всех возможных случаях (например, каков статус, когда последовательность «Неопределенная, неопределенная»?), но вот идея: рассматривать «неопределенные» случаи как отсутствующие и «вменять» их используя na.locf из пакета zoo для переноса значений. (Или лучше, переопределите его для решения вашего случая.)

library(plyr)
at <- at[with(at, order(Participant_ID, phase)),]
at <- ddply(at, "Participant_ID", function(x) {
    ## have to figure out what to do with missing data
    result.fix <- na.locf(car::recode(x$result, "'Negative'=0; 'Positive'=1;'Indeterminate'=NA;NA=1000"))
    x$status <- NA
    x$status[-1] <- result.fix[-1]-result.fix[-length(result.fix)]
    x$status <- car::recode(x$status, "-1='reversion'; 1='conversion'; 0='stable'; else=NA")
    x$status[x$result=="Indeterminate"] <- "stable or inconclusive"
    x
})

Однако не уверен, что это можно назвать элегантным!

person Eduardo Leoni    schedule 07.05.2010
comment
Это значительно элегантнее, чем большой список if() утверждений, которые я планировал составить — спасибо, Эдуардо! - person Matt Parker; 07.05.2010