如何从行为序列中证明合作

机器算法验证 r 序列分析
2022-03-19 21:47:52

情况:两只鸟(雄性和雌性)在巢中保护它们的蛋免受入侵者的侵害。每只鸟都可以使用攻击或威胁进行保护,并且可以在场或不在场。数据中出现了一种模式,即行为可能是互补的——男性攻击而女性使用威胁显示,反之亦然。

我的问题是:如何统计证明这种合作? 或者任何人都可以知道一些处理类似分析的行为研究吗?我发现的绝大多数顺序分析都集中在 DNA 上。

在此处输入图像描述

这里我提供了一些虚拟数据,但我的原始数据集是由几十对组成的,这些对是在保卫它们的巢穴时正好记录了 10 分钟的。因此,每只鸟的行为序列长 600 个状态(每一秒都有状态)。这些较短的数据应包含类似于整个数据集的模式。

male_seq <- rep(c("absent","present","attack","threat","present","attack",
                  "threat","present","attack","absent"),
                  times = c(3,4,8,2,6,3,2,6,2,1))

female_seq <- rep(c("absent","present","threat","present","threat","present",
                    "threat","attack","present","threat","attack","present",
                    "attack","threat","absent"),
                  times = c(2,6,2,1,2,1,1,3,5,3,1,3,3,2,2))
2个回答

自您上次发表评论以来,我发布了第二个答案

所谓合作,我的意思是“当男性攻击时,女性会威胁”,我想用另一种选择来检验这个假设:“当男性攻击时,女性不喜欢威胁”(换句话说,女性的行为与男性行为无关)。

是游戏规则的改变者。似乎可以从完全不同的角度解决问题。首先,当男性攻击时,您对部分样本感兴趣。其次,如果在这种情况下,女性制作零食的频率是否比我们随机制作的要多,您会感兴趣。为了检验这样的假设,我们可以使用置换检验:随机打乱male_seqfemale_seq(没关系),然后计算在哪里male_seq == "attack"获得female_seq == "treat"零分布的情况。接下来,将从您的数据中获得的计数与空分布中的计数进行比较以获得p-价值。

prmfun <- function() {
  sum(female_seq[sample(male_seq) == "attack"] == "threat")
}

mean(replicate(1e5, prmfun()) >= sum(female_seq[male_seq == "attack"] == "threat"))
## [1] 5e-05

您可以根据您如何定义女性的“偏好”来不同地定义您的测试统计数据。在这种情况下,排列测试是对您的直接解释H0:“女性的行为与男性的行为无关”,这导致:“女性的行为是随机给定的男性行为”,因此行为被随机打乱H0.

此外,即使您假设行为出现在相同行为的集群中重复了一段时间,通过排列测试,您也可以打乱整个集群:

female_rle <- rle(female_seq)
n_rle <- length(female_rle$values)

prmfun2 <- function() {
  ord <- sample(n_rle)
  sim_female_seq <- rep(female_rle$values[ord], female_rle$lengths[ord])
  sum(sim_female_seq[male_seq == "attack"] == "threat")
}

mean(replicate(1e5, prmfun2()) >= sum(female_seq[male_seq == "attack"] == "threat"))
## [1] 0.00257

在任何一种情况下,您提供的数据中的合作模式似乎都不是随机的。请注意,在这两种情况下,我们都忽略了该数据的自相关性质,而是在问:如果我们选择男性攻击的随机时间点,女性会更少还是更有可能同时进行治疗?

由于您似乎在谈论因果关系(“当......然后”),在进行排列测试时,您可能有兴趣比较男性的行为t1女性行为的时间t时间(女性对男性行为的“反应”是什么?),但这是你必须问自己的事情。置换测试很灵活,可以很容易地适应您所描述的问题。

您可以根据双变量马尔可夫链来考虑您的数据。你有两个不同的变量X对于女性和Y对于男性来说,它描述了变化的随机过程XY有时t到四种不同状态之一。让我们表示Xt1,iXt,j过渡为Xt1t时间,从i-th 到j-th 状态。在这种情况下,及时转换到另一个状态取决于之前的状态X 并且Y

Pr(Xt1,iXt,j)=Pr(Xt,j|Xt1,i,Yt1,k)Pr(Yt1,hYt,k)=Pr(Yt,h|Yt1,k,Xt1,i)

转移概率可以通过计算转移历史和事后归一化概率轻松计算:

states <- c("absent", "present", "attack", "threat")
# data is stored in 3-dimensional array, initialized with
# a very small "default" non-zero count to avoid zeros.
female_counts <- male_counts <- array(1e-16, c(4,4,4), list(states, states, states))
n <- length(male_seq)

for (i in 1:n) {
  male_counts[female_seq[i-1], male_seq[i-1], male_seq[i]] <- male_counts[female_seq[i-1], male_seq[i-1], male_seq[i]] + 1
  female_counts[male_seq[i-1], female_seq[i-1], female_seq[i]] <- female_counts[male_seq[i-1], female_seq[i-1], female_seq[i]] + 1
}

male_counts/sum(male_counts)
female_counts/sum(female_counts)

也可以使用边际概率轻松模拟:

male_sim <- female_sim <- "absent"

for (i in 2:nsim) {
  male_sim[i] <- sample(states, 1, prob = male_counts[female_sim[i-1], male_sim[i-1], ])
  female_sim[i] <- sample(states, 1, prob = female_counts[male_sim[i-1], female_sim[i-1], ])
}

这种模拟的结果如下图所示。

在此处输入图像描述

此外,它还可用于提前一步预测:

male_pred <- female_pred <- NULL

for (i in 2:n) {
  curr_m <- male_counts[female_seq[i-1], male_seq[i-1], ]
  curr_f <- female_counts[male_seq[i-1], female_seq[i-1], ]
  male_pred[i] <- sample(names(curr_m)[curr_m == max(curr_m)], 1)
  female_pred[i] <- sample(names(curr_f)[curr_f == max(curr_f)], 1)
}

您提供的数据的准确率为 69-86%:

> mean(male_seq == male_pred, na.rm = TRUE)
[1] 0.8611111
> mean(female_seq == female_pred, na.rm = TRUE)
[1] 0.6944444

如果转换随机发生,则转换概率将遵循离散均匀分布。这不是证明,但可以作为使用简单模型思考数据的一种方式。