Сравнение значений в продольном направлении в R ... с поворотом - PullRequest
2 голосов
/ 07 мая 2010

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

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

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

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

1 Ответ

2 голосов
/ 07 мая 2010

Я не думаю, что вы обрисовали в общих чертах, что должно происходить во всех возможных случаях (например, каков статус, когда последовательность является «неопределенным, неопределенным»?), Но вот идея: трактуйте «неопределенные» случаи как отсутствующие и вменяйте их, используя 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
})

Не уверен, что это считается элегантным!

...