2016-04-26 2 views
0

Я новичок в R, и я хотел бы провести анализ выживаемости по набору данных о лампочках, которые у меня есть. Я хотел бы рассчитать время жизни лампочки, поэтому мне нужно рассчитать период времени между date_broken в строке 2 и date_solved в строке 1, например.Создание цензурированных переменных для анализа суправа из дат

Я знаю, что я могу использовать difftime(time, time2, units = "days") для расчета времени между date_fixed и date_broken в же подряд, но тогда я бы рассчитать время, лампочка была нарушена, и это не то, что меня интересует.

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

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

# date_broken date_fixed lightbulb location 
# 1 26-2-2015 17-3-2015  1  A 
# 2 19-3-2015 26-3-2015  1  A 
# 3 26-3-2015 26-3-2015  1  A 
# 4 17-4-2015 29-4-2015  2  B 
# 5 19-6-2015 25-6-2015  2  B 
# 6 9-7-2015 30-7-2015  2  B 



ds <- data.frame( date_broken = c("26-2-2015", "19-3-2015", 
            "26-3-2015", "17-4-2015", 
            "19-6-2015", "9-7-2015"), 
        date_fixed = c("17-3-2015", "26-3-2015", "26-3-2015", "29-4-2015", "25-6-2015", "30-7-2015"), 
        lightbulb = c("1`", "1", "1", "2", "2", "2"), location = c("A", "A", "A", "B", "B", "B")) 

ответ

1

Сначала вам нужно исправить ваш даты, как предложил @ Гаурав. Затем вам нужно будет суммировать lightbulb, иначе разница будет бессмысленной. я представляю здесь альтернативу, используя пакеты lubridate и data.table:

library(lubridate) 
library(data.table) 
ds$date_broken <- dmy(ds$date_broken) 
ds$date_fixed <- dmy(ds$date_fixed) 
setDT(ds) 

setDT(ds)[, dt := difftime(date_fixed, shift(date_broken, 1L, type="lag"), "days"), by = lightbulb] 
ds 

который производит:

## date_broken date_fixed lightbulb location  dt 
    ## 1: 2015-02-26 2015-03-17   1  A NA days 
    ## 2: 2015-03-19 2015-03-26   1  A 28 days 
    ## 3: 2015-03-26 2015-03-26   1  A 7 days 
    ## 4: 2015-04-17 2015-04-29   2  B NA days 
    ## 5: 2015-06-19 2015-06-25   2  B 69 days 
    ## 6: 2015-07-09 2015-07-30   2  B 41 days 

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

+0

Спасибо за подсказку, я сделаю это в следующий раз! – Mini

+0

Если какой-либо из ответов разрешил ваш вопрос, вы можете рассмотреть его как принятый ответ, щелкнув галочку под голосованием ответа – PavoDive

1

Это должно помочь

library(dplyr) 
ds2 <- ds %>% 
    group_by(lightbulb) %>% 
    mutate(tp = as.Date(date_broken, "%d-%m-%Y") - 
        as.Date(lag(date_fixed,1), "%d-%m-%Y")) 
+0

Это должно работать теоретически, но это будет иметь проблемы с датами, поскольку они в настоящее время отформатированы. Формат даты по умолчанию - yyyy-mm-dd, поэтому «26-2-2015» читается как 20 февраля 0026 года. Попробуйте добавить аргумент «% d-% m-% y» к функциям as.Date в приведенном выше ответьте, чтобы он работал с вашими датами в отформатированном виде. –

+1

Не ''% d-% m-% y "'. Используйте ''% d-% m-% Y "' –

0

Мне очень нравятся эти супер-впечатляющие операторы труб в Р. Они настолько элегантны и великолепны, если у кого-то есть готовое решение.

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

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

Сначала конвертировать даты ...

## convert dates. once done it's done 
ds$date_broken <- as.Date(ds$date_broken, "%d-%m-%Y") 
ds$date_fixed <- as.Date(ds$date_fixed, "%d-%m-%Y") 

Добавьте столбец счетчика последовательности (так называемый Seq), чтобы отслеживать количество отказов

ds$seq <- 1 

занесения что колонка счетчик

for (rdx in 2:nrow(ds)) { 
    ## if same item, increment count. If new item, start new count at seq = 1 
    ifelse(ds$lightbulb[rdx] == ds$lightbulb[rdx-1], ds$seq[rdx] <- ds$seq[rdx-1]+1, 1) 
} 

Теперь добавьте разницу столбец

ds$diff <- NA 

Заполните эту разностную колонку

for (rdx in 2:nrow(ds)) { 
    ## if same item, difference is current failure date minus previous in-service date 
    ifelse(ds$seq[rdx] != 1, ds$diff[rdx] <- ds$date_broken[rdx] - ds$date_fixed[rdx-1], NA) 
} 

Хорошо, что сработало для меня как для концептуализации, так и для реализации. Обратите внимание, что некоторые люди немного зацикливаются на петлях (http://paleocave.sciencesortof.com/2013/03/writing-a-for-loop-in-r/), но вокруг моей шеи в лесу живет жизнь, а не кодирование, и даже иногда я иногда накидываю отверткой отвертку (старую).