将马尔可夫链用于时间序列数据
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
列代表:
ID
: 身份证号码
date
: 观察日期
km
: 位置
sps
: 物种代码
time
:观察时间
pp
: 如果观察到的物种 (sps
) 是捕食者 (1) 或猎物 (0)
datetime
:将 date
和 time
行转换为 as.POSIXct
格式
我要回答的问题:
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
)?
背景:
- 对于每个位置 (
km
),我的数据中都有一个唯一的行,其中包含拍摄图像的时间以及照片是捕食者还是猎物的标识。
- 每个位置都有很多捕食者和猎物的照片。
- 对于每个位置,捕食者和猎物的观察都是按时间顺序进行的。
我想做什么:
对于每个位置,详尽计算观察的时间对的数量:猎物-猎物、猎物-捕食者、捕食者-猎物和捕食者-捕食者。
对于每个位置,打乱(随机化)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
我们可以将转移概率与稳态进行比较。如果转换只是随机的,那么转换将不依赖于先前的状态,它们将只等于稳态值。
既然情况并非如此,那么很明显,如果你有一个捕食者,你就更有可能拥有另一个捕食者,反之亦然。
这是我的数据框当前的结构(前 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
列代表:
ID
: 身份证号码date
: 观察日期km
: 位置sps
: 物种代码time
:观察时间pp
: 如果观察到的物种 (sps
) 是捕食者 (1) 或猎物 (0)datetime
:将date
和time
行转换为as.POSIXct
格式
我要回答的问题:
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
)?
背景:
- 对于每个位置 (
km
),我的数据中都有一个唯一的行,其中包含拍摄图像的时间以及照片是捕食者还是猎物的标识。 - 每个位置都有很多捕食者和猎物的照片。
- 对于每个位置,捕食者和猎物的观察都是按时间顺序进行的。
我想做什么:
对于每个位置,详尽计算观察的时间对的数量:猎物-猎物、猎物-捕食者、捕食者-猎物和捕食者-捕食者。
对于每个位置,打乱(随机化)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
我们可以将转移概率与稳态进行比较。如果转换只是随机的,那么转换将不依赖于先前的状态,它们将只等于稳态值。
既然情况并非如此,那么很明显,如果你有一个捕食者,你就更有可能拥有另一个捕食者,反之亦然。