2015-11-02 4 views
1

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

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

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

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

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

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

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

UPDATE (только пример, чтобы пояснить, что я хотел бы получить в течение первых 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+) | 
+0

Если вы хотите, чтобы ваши коэффициенты перехода менялись со временем, они будут разными в каждый момент времени. Итак, я не могу понять, как вы представляете это с помощью одной матрицы 10x10. Просьба уточнить, что вы хотите сделать с минимальным примером, например, трех состояний и 3-4 временных точек. – Gilbert

+0

@ Гилберт Я добавил визуальный пример выше, чтобы уточнить, что я имею в виду, имеет ли это смысл? –

+0

@ Гилберт, я также понял, что создание seqdef из sts делает время абсолютным, в то время как мне нужно будет вычислить среднее значение относительно начала каждой задачи, а не среднее от времени начала всего набора данных –

ответ

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 

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

+0

Спасибо @Gilbert! Это похоже на то, что мне нужно. Хотя у меня есть немного troube, получившего вектор 'new.start' для' seqstart'. У функции TraMineR или TraMineRextras есть функция для извлечения первой даты для каждой последовательности, которая не является значением по умолчанию ('None' для меня)? –

+0

@ Victor.dMdB «data.start» - это выбор пользователя. Как и в моем примере, обычно это метка времени первого элемента в последовательности, то есть время, связанное с первым столбцом в форме STS. Чтобы установить его как первое время появления указанного состояния B, вы можете рассмотреть функцию 'seqfpos' TraMineR'. Например, вы получаете позицию первого действительного состояния 's.age', действуя следующим образом:' s.TF <- seqdef (s.age == "*") '; 'first.valid <- seqfpos (s.TF," FALSE ")'. – Gilbert

Смежные вопросы