Скорость перехода как функция времени

Я потратил некоторое время на изучение R и TraMineR пакета, чтобы иметь возможность анализировать экспорт MySQL событий перехода (состояний для целей этого обсуждения) моих элементов БД (так что в формате TSE).

У меня есть 10 состояний, которые могут переходить в любое другое состояние (т.е. нет определенного порядка).

До сих пор мне удалось преобразовать эти данные в STS, используя базовую единицу времени 1 час, чтобы иметь возможность использовать функцию seqtrate, которая предоставляет мне абсолютную скорость перехода из каждого состояния в другое состояние (в таблице 10x10 ).

У меня проблемы с вычислением скорости перехода как функции времени. Я предполагал, что это снова будет отображаться в виде таблицы 10x10, но вместо абсолютных значений в каждой ячейке это может быть дискретный график, представляющий скорость в зависимости от времени (например, ‹24 часа, 24-72 часа, 72-168 часов,> 168h).

Есть опция time.varying для seqtrate, но она рассчитывает ставку для каждой единицы времени, и я не вижу опции для определения конкретных таймфреймов.

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

Есть ли у меня другая функция для этого? Или мне нужно будет кодировать это вручную, используя параметр seqtrate time.varying? Если последнее, не могли бы вы направить меня на правильный путь, я не уверен, с чего начать.

ОБНОВЛЕНИЕ (просто пример, чтобы прояснить, что я хотел бы получить для первых 3 состояний)

        |               State1                  |               State2                  |               State3                  |
State1  | av(<24),av(24-72),av(72-168),av(168+) | av(<24),av(24-72),av(72-168),av(168+) | av(<24),av(24-72),av(72-168),av(168+) |
State2  | av(<24),av(24-72),av(72-168),av(168+) | av(<24),av(24-72),av(72-168),av(168+) | av(<24),av(24-72),av(72-168),av(168+) |
State3  | av(<24),av(24-72),av(72-168),av(168+) | av(<24),av(24-72),av(72-168),av(168+) | av(<24),av(24-72),av(72-168),av(168+) |

person Victor.dMdB    schedule 02.11.2015    source источник
comment
Если вы хотите, чтобы скорость перехода менялась со временем, она будет разной в каждый момент времени. Итак, я не могу понять, как вы бы изобразили это с помощью одной матрицы 10x10. Пожалуйста, поясните, что вы хотите сделать, на минимальном примере из трех состояний и 3-4 временных точек.   -  person Gilbert    schedule 25.11.2015
comment
@Gilbert Я добавил визуальный пример выше, чтобы прояснить, что я имею в виду, имеет ли это больше смысла?   -  person Victor.dMdB    schedule 26.11.2015
comment
@Gilbert, я также понял, что создание seqdef из sts делает время абсолютным, в то время как мне нужно будет вычислить среднее значение относительно начала каждой задачи, а не среднее с начала времени всего набора данных   -  person Victor.dMdB    schedule 26.11.2015
comment
Из вашего примера кажется, что вам нужен элемент для каждого временного интервала в каждой ячейке, то есть вероятность перехода для каждого временного интервала. Пожалуйста, дайте нам знать, если вы ожидаете ответ ниже.   -  person Gilbert    schedule 28.11.2015
comment
Кстати, способ организации данных (STS, SPS, ...) ничего не изменит. Внутренне TraMineR преобразует любой формат последовательности состояний, отличный от STS, в STS.   -  person Gilbert    schedule 28.11.2015


Ответы (1)


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

Итак, вам нужно сначала изменить выравнивание ваших последовательностей. Пакет TraMineRextras предлагает для этого функцию seqstart. Вот пример, в котором мы преобразуем данные панели в данные с привязкой к возрасту.

library(TraMineRextras)
## Example data aligned on calendar years, starting in 2000
paneldata <- matrix(
    c("A" , "A" , "B" , "A" , "A" ,
      "A" , "A" , "B" , "B" , "B" ,
      "A" , "A" , "B" , "B" , "B" ,
      "B" , "A" , "A" , "B" , "B" ,
      "A" , "B" , "A" , "A" , "B"), byrow=TRUE, ncol=5)
colnames(paneldata) <- 2000:2004

## original sequences aligned on years 
(s.panel <- seqdef(paneldata))  

## Sequence         
## 1 A-A-B-A-A
## 2 A-A-B-B-B  
## 3 A-A-B-B-B    
## 4 B-A-A-B-B      
## 5 A-A-A-A-B

## Change from calendar date to age alignment
startyear <- 2000
birthyear <- 1995:1999 ## just to illustrate
agedata <- seqstart(paneldata, data.start=startyear, new.start=birthyear)
colnames(agedata) <- 1:ncol(agedata)

## sequences aligned on ages
(s.age <- seqdef(agedata))  

## Sequence         
## 1 *-*-*-*-A-A-B-A-A
## 2 *-*-*-A-A-B-B-B  
## 3 *-*-A-A-B-B-B    
## 4 *-B-A-A-B-B      
## 5 A-A-A-A-B

После того, как вы правильно выровняли свои последовательности, вы просто вычисляете вероятности перехода по интервалам времени, здесь возрастные классы 1–5 и 6–9.

seqtrate(s.age[,1:5])

##        [-> A]    [-> B]
## [A ->] 0.6363636 0.3636364
## [B ->] 0.3333333 0.6666667

seqtrate(s.age[,6:9])

##          [-> A] [-> B]
## [A ->]   0.50   0.50
## [B ->]   0.25   0.75

Надеюсь это поможет.

person Gilbert    schedule 27.11.2015
comment
Спасибо @Gilbert! Это похоже на то, что мне нужно. Хотя у меня проблемы с получением вектора new.start для seqstart. Есть ли у TraMineR или TraMineRextras функция для извлечения первой даты для каждой последовательности, которая не является значением по умолчанию (None для меня)? - person Victor.dMdB; 02.12.2015
comment
@ Victor.dMdB data.start - выбор пользователя. Как и в моем примере, это обычно метка времени первого элемента в последовательности, то есть время, связанное с первым столбцом в форме STS. Чтобы установить его как время первого появления, скажем, состояния B, вы можете рассмотреть функцию seqfpos TraMineR. Например, вы получите позицию первого действительного состояния s.age, выполнив следующие действия: s.TF <- seqdef(s.age=="*"); first.valid <- seqfpos(s.TF,"FALSE"). - person Gilbert; 02.12.2015