基于R语言的多人群二元时间序列synchrony分析方法问询
针对群体二元时间序列的滚动同步性分析方案(R实现)
核心思路
针对你拥有的秒级二元人群时间序列,采用滚动窗口+高效聚合统计量的方案,既支持数百人群的大规模数据,又能生成每秒的量化同步性得分,避免固定离散窗口的局限性。核心是用O(n)复杂度的统计量(避开成对关联的O(n²)冗余计算),结合滚动窗口实现时间维度的连续分析。
实现步骤
1. 环境准备与数据构造
先安装并加载所需工具包,同时构造符合场景的示例数据(30秒、100人群):
set.seed(123) # 安装依赖包 install.packages(c("slider", "ggplot2", "irr")) library(slider) library(ggplot2) library(irr) # 构造示例数据:30行=30秒,100列=100人,二元值(1=事件发生,0=未发生) df <- data.frame(matrix(rbinom(30*100, 1, 0.1), nrow=30, ncol=100)) colnames(df) <- paste0("person_", 1:100) # 手动模拟高同步(红框)、中等同步(蓝框)段 df[10:15, 1:80] <- 1 # 第10-15秒:80%人群同时触发事件 df[20:25, 1:50] <- 1 # 第20-25秒:50%人群同时触发事件
2. 滚动同步性得分计算
提供3种量化指标,可根据需求选择,所有指标均基于7秒中心滚动窗口(可灵活调整为5-10秒):
指标1:归一化方差得分(直观同步性指标)
通过窗口内群体事件比例的方差反向量化同步性:方差越小,人群响应越集中(同步性越高),归一化后得分范围0-1,越接近1同步性越强。
window_size <- 7 # 可改为5、10等 # 计算每秒的群体事件发生比例 event_prop <- rowMeans(df) # 滚动计算归一化方差得分 sync_var <- slide_dbl(event_prop, function(x) { prop_var <- var(x) 1 - (prop_var / 0.25) # 二元比例的最大方差为0.25,归一化到0-1 }, .window = window_size, .align = "center")
指标2:滚动同步事件占比
统计窗口内,群体事件比例超过阈值(如高同步>0.7、中等同步>0.5)的时间点占比,直接反映窗口内高/中等同步的持续程度:
# 高同步占比(窗口内≥70%人群触发事件的时间占比) sync_high <- slide_dbl(event_prop, function(x) mean(x > 0.7), .window = window_size, .align = "center") # 中等同步占比(窗口内≥50%人群触发事件的时间占比) sync_medium <- slide_dbl(event_prop, function(x) mean(x > 0.5), .window = window_size, .align = "center")
指标3:滚动Fleiss' Kappa(专业群体一致性指标)
Fleiss' Kappa是专门用于多评判者(多人群)一致性的统计量,取值范围-1到1,越接近1说明群体同步性越强:
# 滚动计算Fleiss' Kappa(需转置数据适配irr包格式) sync_kappa <- slide_dfr(df, function(window_data) { t_data <- t(window_data) kappa_res <- kappam.fleiss(t_data) data.frame(kappa = kappa_res$value) }, .window = window_size, .align = "center")$kappa
3. 结果整合与可视化
将所有得分整合为数据框,并用可视化展示同步性随时间的变化趋势:
# 整合结果 result_df <- data.frame( second = 1:nrow(df), event_prop = event_prop, sync_var = sync_var, sync_high = sync_high, sync_medium = sync_medium, sync_kappa = sync_kappa ) # 可视化同步性趋势 ggplot(result_df, aes(x = second)) + geom_line(aes(y = sync_var, color = "归一化方差得分"), linewidth = 1) + geom_line(aes(y = sync_kappa, color = "Fleiss' Kappa"), linewidth = 1) + geom_line(aes(y = sync_high, color = "高同步占比"), linewidth = 1) + # 标注示例中的高/中等同步段 annotate("rect", xmin = 9.5, xmax = 15.5, ymin = 0, ymax = 1, alpha = 0.2, fill = "red") + annotate("rect", xmin = 19.5, xmax = 25.5, ymin = 0, ymax = 1, alpha = 0.2, fill = "blue") + labs(x = "时间(秒)", y = "同步性得分", color = "指标类型") + theme_minimal()
方案符合要求验证
- R语言实现:所有代码基于R标准包,可直接运行;
- 支持数百列:
rowMeans、slider均为向量/矩阵级操作,即使1000列也能高效处理; - 无需预定义固定块:滚动窗口是连续的,每个时间点的得分基于周边动态窗口,而非离散块;
- 滚动窗口模式:可灵活设置窗口大小(5-10秒),为每秒生成同步得分,清晰展现时间趋势;
- 量化数值输出:所有指标均为可解释的数值(0-1或-1到1),而非仅依赖颜色编码。
内容的提问来源于stack exchange,提问作者socialresearcher
相关产品推荐
相关产品推荐

