2013-06-27 2 views
0

Я хочу построить ретроспективном тестирование для лог-рангового, что сравнение отдельных групп друг с другом:Формула R: как ограничить вычисления двумя группами, используя формулу?

library(survival) 
survdiff(DV ~ IV, data=mydf) 

Есть ли способ сделать что-то вроде этого (например, сравнивать группы 2 с группой 7) :

survdiff(DV ~ I(if(as.numeric(IV) == 2) {1} else {if(as.numeric(IV) == 7) {2} else {NA}}), data=mydf) 

Я знаю, что я могу отфильтровать не нужные строки из mydf и Surv объекта DV

df2vs7<-mydf[as.numeric(mydf$IV)==2 | as.numeric(mydf$IV)==7,] 
DV2vs7<-DV[as.numeric(mydf$IV)==2 | as.numeric(mydf$IV)==7,] 

Но я думаю, что это очень неэффективно; компьютер должен будет хранить каждый отдельный объект данных для каждой комбинации сравниваемых групп.

+0

Не согласен с «очень неэффективной» частью. – zx8754

+0

@ zx8754 Почему? AFAIK, для этого потребуется примерно (n-1) раз больше, чем требуется исходному mydf. R не может подмножать строки дешево (то есть по ссылке). –

ответ

1

Что-то вроде этого?

survdiff(DV ~ IV, data=mydf[ as.numeric(mydf$IV) %in% c(2,7),])

+0

Ну, это не технически ответ на мой вопрос (он не меняет формулу), но он определенно решает мою проблему. Вы также должны сделать то же самое для объекта «DV» (он не может быть частью DataFrame, потому что он имеет тип «Surv') –

+0

Являются ли переменные' DV' и 'I' из одного и того же' mydf' данных? – zx8754

+0

_В самом деле это 'IV' не' I' (опечатка) _. Да, они из одного набора данных, но 'DV' имеет тип' Surv'. –

2

Используйте subset аргумент survdiff внутри (вложенного) цикла. Возможно, вам придется настроить петли, чтобы избежать ошибок, но вы получите эту идею.

l <- list() 
n <- <no. of groups> 
mydf$IV <- as.numeric(mydf$IV) 
for(i in seq_len(n - 1)) 
{ 
    for(j in seq(i + 1, to=n, by=1)) 
    { 
     l <- c(l, survdiff(DV ~ factor(IV), mydf, subset=IV %in% c(i, j))) 
    } 
} 
+1

Возможно, кто-то умнее меня может переписать, используя '* apply'. –

+0

Версия, вставленная в отдельном ответе, представляет собой 'plyr'ed и измененную версию вашего ответа. –

2

ОК, это решение пасты копия &. Предположу, что мы имеем df в dataframe объект, где мы имеем IV категориальных переменные с length(levels(df$IV)) уровней, а DF объекта типа Surv, и мы хотим, чтобы выполнить попарные лог-ранговые между каждой парой групп

library(gregmisc) 
levels<-sort(unique(as.numeric((mydf$IV)))) 
groups<-combinations(length(levels),2,levels) 
#or if we assume that levels produced by as.numeric(mydf$IV) are in sequence 1:n, we can use more efficient: 
#groups<-combinations(length(levels(df$IV)),2) 
library(plyr) 
alply(groups, 1, 
    function(pair) { 
     survdiff(DV ~ factor(IV), mydf, subset=IV %in% c(pair[[1]], pair[[2]])) 
    } 
) 

Последним выражением возвращает результаты

+0

+1 Ты умнее меня –