R - 流线型马尔可夫链

R - Streamlined Markov Chain

我有两个数据集,年度转移概率和初始值。我们的目标是利用这些来了解一家公司在五年后会是什么样子。

初始值的格式为:

|     Age       |      Gender    |     Initial     |
----------------------------------------------------
|  18           | F              |  30             |
|  19           | M              |  35             |
|  20           | F              |  40             |
...             |                |
|  Out          |                |  400            |

其中初始值包含有关未来招聘的数据。这个数字可以根据解决方案的需要进行修改,但目前它代表的是每年的招聘人数。

转移概率的形式为

|   Age        |    Gender    |   Hire       |    Terminate    |
----------------------------------------------------------------
|   18         |    F         |   0.025      |    0.3          |     
|   18         |    M         |   0.03       |    0.1          |
|   19         |    F         |   0.01       |    0.4          |
...

也就是说,所有招聘人员中有 2.5% 是 18 岁的女性,所有 18 岁女性中有 30% 会离开公司。

使用马尔可夫转移概率我们有

p(Out, 18F) = 0.025
p(18F,Out) = 0.3
p(18F,19F) = 0.7 #The complement action to leaving the company is staying and getting a year older

假设没有性别变化或时间机器,所有其他转换概率将为 0。

有没有一种方法可以简化预测过程,这样我就不需要生成转移矩阵,转移矩阵不必大部分都为零?你会怎么做? (使用或不使用 "markovchain" 包)

PS:在我写这篇文章时,我意识到拥有两张表,一张用于男性,另一张用于女性,并分别计算它们的效率更高了一步,但这仍然不是我的目标想要。

后来解决了:最简单的是每个 age/gender 组都有一个马尔可夫链,可以简化为一个数据框。

可以将初始值left_join编辑到数据结构中的转换概率d

d$temp <- lag(d$Initial * d$Terminate)
d$temp[1] <- 0 #Gets rid of NA
d$temp <- d$temp + d$hire*TotHires[1]
#where TotHires[1] represents the number hired in year 1

这给出了一年后的结果。 n 年以来,我们有

d$temp <- d$Initial
for (y in 1:n) {
  d$temp <- lag(d$temp * d$Terminate)
  d$temp[1] <- 0 #Gets rid of NA
  d$temp <- d$temp + d$hire*TotHires[n]
  #where TotHires[n] represents the number hired in year n
}