以下是我的数据框当前结构的方式(前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
:location sps
:物种代码time
:观察时间pp
:代码如果观察到的物种(sps
)是捕食者(1)或猎物(0)datetime
:将date
和time
行转换为as.POSIXct
格式我想回答的问题:
观察到捕食者(
pp
= 1)的可能性是否随着捕食次数(pp
= 0)的增加而增加(例如猎物跟随捕食者的可能性比捕食者更可能通过猎物等)在每个位置(km
)?
背景:
km
),我的数据中有一个唯一的行,包括拍摄图像的时间以及照片是捕食者还是猎物的标识。我想做什么:
对于每个位置,详尽地计算观测时间对的数量:猎物 - 食饵,食饵 - 捕食者,捕食者 - 食饵和捕食者 - 捕食者。
对于每个位置,随机播放(随机化)捕食/猎物的观察(即保持与观察到的捕食/捕食的总数相同)并计算由洗牌产生的观察对的数量:猎物 - 猎物,食饵 - 捕食者,捕食者 - 食饵和捕食者 - 捕食者。记录。计算步骤(1)中观察次数与每次洗牌后观察次数之间的差异。重复1000次。这应该让我意识到猎物,猎物,捕食者 - 捕食者和捕食者 - 捕食者配对序列的原始观察有多大可能被给予观察到的捕食/猎物比例。
我的问题:
假设马尔可夫链模型是回答我问题的最合适方式,我怎样才能在R中编码?
此时,我相信我应该使用的R包是markovchain
,但我不知道如何将第1步和第2步转换为R代码。
答案 0 :(得分:3)
以下是一些代码:
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
我们可以将转换概率与稳态进行比较。如果转换只是随机的,那么转换将不依赖于先前的状态,它们将仅等于稳态值。
由于情况并非如此,很明显,如果你有一只捕食者,你更有可能拥有另一只捕食者,反之亦然。