Вероятности перехода одной деятельности в другую, например, с работы на поездку, для каждой минуты дня - PullRequest
1 голос
/ 17 апреля 2020

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

head (Деятельности) вернет тиббл: 6 x 145

  serial act1_1 act1_2 act1_3 act1_4 act1_5 act1_6 act1_7 act1_8 act1_9  act1_10
     1  110    110    110    110    110    110    110    110    110    110    
     2 110    110    110    110    110    110    110    110    110    110    
     3 110    110    110    110    110    110    110    110    110    110    
     4 110    110    110    110    110    110    110    110    110    110    
     5 110    110    110    110    110    110    110    110    110    110    
     6 110    110    110    110    110    110    110    110    110    110    

# ... with 134 more variables: act1_11 <dbl+lbl>, act1_12 <dbl+lbl>,

Размер матрицы "Деятельности": ncol = 144 и nrows = 16533; act1_1 ... ac1_144 являются временными шагами, и время представляется с интервалами в 10 минут (например, act1_1 = 4.10am; act1_2 = 4.20am ..). Время начинается с 4 утра (act1_1) и заканчивается в act1_144 (4 утра). Столбцы заполнены различными действиями, такими как 110 = сон, 111 = просмотр ТВ, 123 = прием пищи и т. Д. c.

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

transition.matrix <- function(X, prob=T)
{
    tt <- table( c(X[,-ncol(X)]), c(X[,-1]) )
    if(prob) t <- tt / rowSums(tt)
    tt
}
I call the function as:

transitionfunction <- trans.matrix(as.matrix(Activities))

С помощью этой функции мне удалось вычислить вероятности перехода между действиями (матрица действий).

Но как я могу рассчитать переходы для каждой минуты дня?

1 Ответ

1 голос
/ 17 апреля 2020

Используйте apply с rep(..., each=10).

Если ваши данные такие, как вы говорите, то следующая команда расширит кадр данных с одного на 145 столбцов (последовательный + 144 10-минутных интервалов в одном 24-часовой период) в один с 1441 столбцом (последовательный + 1440 1-минутных интервалов в одном 24-часовом периоде).

Activities1 <- data.frame(Activities[,1], 
                          t(apply(Activities[,-1], 1, FUN=rep, each=10)))

names(Activities1) <- c("serial", paste("act1", seq_len(1440), sep="_"))
dim(Activities1)
#[1] 16533  1441

Что касается вашей функции, я исправил ошибку в соответствии с вашим комментарием.

transition.matrix <- function(X, prob=T)
{
  tt <- table( c(X[,-ncol(X)]), c(X[,-1]) )
  if(prob) tt <- tt / rowSums(tt)
  tt
}

И, возможно, пропустите последовательный столбец при вызове функции. Вот результат для 10-минутных интервалов:

transitionfunction <- transition.matrix(as.matrix(Activities[,-1]))
transitionfunction

#       110   111   123
# 110 0.334 0.332 0.333
# 111 0.334 0.333 0.332
# 123 0.332 0.333 0.335

Учитывая, что данные случайные (см. Ниже), результат выглядит разумным

Теперь для 1-минутных интервалов. Вам придется подождать около 1 минуты из-за большего размера данных.

transitionfunction <- transition.matrix(as.matrix(Activities1[,-1]))
transitionfunction

 #       110    111    123
 # 110 0.9338 0.0331 0.0331
 # 111 0.0332 0.9337 0.0331
 # 123 0.0331 0.0331 0.9338

Учитывая, что мы повторили каждое действие 10 раз, результаты кажутся правильными.


Данные (смоделировано):

n <- 16533
ncol <- 144    
set.seed(404)

Activities <- data.frame(serial=1:n,
                           matrix(sample(c(110,111,123), size=n*ncol, replace=TRUE), ncol=144))
dim(Activities)
names(Activities) <- c("serial", paste("act1", 1:ncol, sep="_"))

Activities[1:6, 1:11]
  serial act1_1 act1_2 act1_3 act1_4 act1_5 act1_6 act1_7 act1_8 act1_9 act1_10
1      1    111    123    110    110    111    111    111    110    110     110
2      2    123    111    123    110    111    123    123    110    111     110
3      3    111    111    111    111    123    111    123    123    110     123
4      4    123    111    110    111    111    110    123    110    111     111
5      5    110    123    110    111    110    110    111    110    123     111
6      6    111    111    111    123    123    110    123    111    110     123
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...