将马尔可夫链用于时间序列数据

Using Markov Chains for time series data

这是我的数据框当前的结构(前 6 行)。我使用的数据可用 here.

ID  date        sps     time    pp  datetime            km
1   2012-06-19  MICRO   2:19    0   2012-06-19 02:19    80
2   2012-06-21  MUXX    23:23   1   2012-06-21 23:23    80
3   2012-07-15  MAMO    11:38   0   2012-07-15 11:38    80
4   2012-07-20  MICRO   22:19   0   2012-07-20 22:19    80
5   2012-07-29  MICRO   23:03   0   2012-07-29 23:03    80
8   2012-08-07  PRLO    2:04    0   2012-08-07 02:04    80

列代表:

我要回答的问题:

Does the likelihood of a predator (pp = 1) being observed increase with the number of times prey (pp = 0) are observed (e.g. is prey followed by predator more likely than prey followed by prey, etc.) at each location (km)?

背景:

我想做什么:

  1. 对于每个位置,详尽计算观察的时间对的数量:猎物-猎物、猎物-捕食者、捕食者-猎物和捕食者-捕食者。

  2. 对于每个位置,打乱(随机化)pred/prey 的观察结果(即保持与观察结果相同的 pred/prey 总数)并计算观察结果对的数量由洗牌产生:猎物-猎物、猎物-捕食者、捕食者-猎物和捕食者-捕食者。记录。计算步骤 (1) 中的观察次数与每次洗牌发现的观察次数之间的差异。重复 1000 次。这应该让我了解猎物-猎物、猎物-捕食者、捕食者-猎物和捕食者-捕食者配对序列的原始观察有多大可能给出 pred/prey.

    [= 的观察比例66=]

我的问题:

假设马尔可夫链模型是回答我问题的最合适方法,我如何才能在 R 中对此进行编码?

此时,我认为我应该使用的 R 包是 markovchain,但我不知道如何将步骤 1 和 2 转换为 R 代码。

这是一些代码:

library(dplyr)
library(markovchain)

读入数据并格式化时间戳

data <- read.table("~/Downloads/d1.txt", sep="\t", header=T, stringsAsFactors=F)
data$datetime <- as.POSIXct(data$datetime)

按时间排序

data <- data[order(data$datetime, decreasing=F),]

对于每个位置,创建一个 pp

序列
data <- data %>% group_by(km) %>% summarize(pp_chain=list(pp)) %>% as.data.frame 
pp_chains <- data$pp_chain; names(pp_chains) <- data$km

在所有序列链上拟合马尔可夫模型

fit <- markovchainFit(pp_chains)

估计转移概率:

print(fit$estimate)
          0          1
0 0.9116832 0.08831677
1 0.5250852 0.47491476

这个矩阵表示从 0 到 0 的转换概率是 0.91;从 0 到 1 的转移概率是 0.088;等等。

估计稳态:

print(steadyStates(fit$estimate))
             0         1
[1,] 0.8560214 0.1439786

我们可以将转移概率与稳态进行比较。如果转换只是随机的,那么转换将不依赖于先前的状态,它们将只等于稳态值。

既然情况并非如此,那么很明显,如果你有一个捕食者,你就更有可能拥有另一个捕食者,反之亦然。