Графики линии жизни R для анализа выживания

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

В идеале я бы хотел, чтобы это выглядело примерно так [это][1]

Мне нужна горизонтальная линия для каждого участника, начиная с даты наблюдения и заканчивая последним днем, когда мы его наблюдали. Люди, у которых последний день наблюдения, должны быть другого цвета (или иметь другой индикатор).

Данные будут выглядеть так:

regdate             lastlogindate            censor   duration
2010-02-24 02:30:43 2010-05-27 07:58:17       0       92
2007-12-23 11:16:37 2008-03-07 10:36:29       1       75
2009-01-19 04:23:28 2009-01-24 06:33:38       1        5
2010-07-25 10:24:39 2010-08-11 07:13:25       0       17
2009-08-23 07:18:06 2009-08-24 06:25:35       1        1
2007-08-12 07:24:55 2010-06-01 06:53:57       0     1024

У Калифорнийского университета в Лос-Анджелесе есть как это делается в Stata. Я сказал своему советнику, что могу повторить все, что он сделал в Stata в R. Мне нужна помощь, ребята :)

РЕДАКТИРОВАТЬ: мне, наконец, удалось понять это правильно.

Вот пример данных с dput.

structure(list(users_id = c(1747516, 913136, 921278, 1654913, 
782364, 1371798, 1174461, 1493894, 1124186, 1249310), 
regdate = c("2010-08-15 05:50:09", "2009-01-04 13:47:46", "2009-01-07 13:34:53", "2010-06-30 11:19:08", "2008-08-13 06:46:28", "2010-01-26 12:58:20", "2009-08-18 15:13:12", "2010-04-04 11:33:47", "2009-07-10 12:33:41", "2009-10-19 13:30:49" ), 
lastlogindate = c("2010-09-01 05:51:34", "2010-09-17 05:25:00", "2009-05-15 07:55:30", "2010-07-02 07:34:02", "2008-10-25 14:29:50",  "2010-03-17 05:04:58", "2010-07-06 03:48:48", "2010-04-09 19:44:42", "2010-09-03 04:18:18", "2009-10-20 06:26:55"), 
censor6 = c(0, 0, 1, 0, 1, 1, 0, 0, 0, 1)), 
.Names = c("users_id", "regdate", "lastlogindate", "censor6"), 
row.names = c(1L, 2L, 4L, 5L, 7L, 9L, 10L, 11L, 12L, 14L), 
class = "data.frame")

Что я сделал, так это расплавил данные с помощью пакета reshape2, чтобы для каждого наблюдения было две строки. Даты начала и окончания. Затем я добавил переменную цензуры с помощью слияния.

# Create a subset of the data with 25 observations
sampData1<-data[c("users_id", "regdate", "lastlogindate")]
sampData1<-sampData1[sample(1:nrow(sampData1),25),]
# Create two entries for each observation 1 for start date 1 for end
sampData1<-melt(sampData1, id.vars="users_id")
sampData1<-sampData1[order(sampData1$users_id, sampData1$value),]
# Add a grouping variable basically the same thing as user ID but looks better on plot
sampData1$ID<-rep(seq(1,nrow(sampData1)/2,1), each=2)
# Put back the censoring variable
sampData1<-merge(sampData1, data[,c("users_id", "censor6")])
sampData1$censor6<-as.factor(sampData1$censor6)
sampData1$value<-as.POSIXct(sampData1$value, origin="1970-01-01 00:00:00")

Теперь давайте создадим сюжет

# Base Plot
gp<-ggplot(sampData1)

# Add the horizontal lines (This is the big deal)
gp+geom_line(aes(value, ID, group=ID, color=censor6, size=1))

# Decluter the x axis labels
gp+scale_x_datetime(breaks=date_breaks('3 month'))
# rotate x axis labels
gp+ theme(axis.text.x = element_text(angle = 45, hjust = 1))
# Change the legend label and colors
gp+scale_color_manual(values = c("red", "blue"))

И вот результат.


person PoorLifeChoicesMadeMeWhoIAm    schedule 09.04.2015    source источник
comment
Если вы знакомы с ggplot2 geom_pointrange, вы проделаете долгий путь к достижению этой цели. docs.ggplot2.org/0.9.3.1/geom_errorbar.html. В целом, ваши вопросы с большей вероятностью вызовут ответы, если вы используете dput для обмена данными, а не копируете их, поскольку это значительно упрощает воссоздание вашей ситуации потенциальным респондентом. stackoverflow.com/ вопросы/5963269/   -  person Pewi    schedule 09.04.2015
comment
Эй, спасибо за комментарий, я изучу эту функцию pointrange. (и будет использовать dput в следующий раз :))   -  person PoorLifeChoicesMadeMeWhoIAm    schedule 10.04.2015
comment
Хорошо, я получил это. Я использовал третье решение в этой теме как основа   -  person PoorLifeChoicesMadeMeWhoIAm    schedule 11.04.2015