纵向(每周)数据不同时间区间的数据覆盖度探究
计算不同周区间的数据覆盖度(R语言实现)
核心思路
要计算不同周区间的覆盖度,核心是先明确每个参与者的有效观测周,再针对目标区间统计两种实用的覆盖指标:
- 全覆盖比例:该区间内所有周都有数据的参与者占总参与者的比例
- 整体覆盖比例:区间内实际观测数占「总参与者数×区间周数」的比例
实现步骤
1. 加载依赖包
用dplyr做数据分组和统计,ggplot2可选用于可视化:
library(dplyr) # 可选:用于可视化 library(ggplot2)
2. 整理每个参与者的有效周数据
先把每个参与者的有效观测周整理成列表,方便后续检查:
# 从清洗后的数据exdata2中提取每个id的有效周 id_valid_weeks <- exdata2 %>% group_by(id) %>% summarise(valid_weeks = list(sort(week))) %>% # 排序后存为列表格式 ungroup()
3. 定义目标周区间
根据需求生成要检查的连续周区间,比如你提到的1-5、2-6这类长度为5的区间(适配12周数据):
# 生成长度为5的连续周区间 target_intervals <- tibble( start = 1:8, end = start + 4 # 区间长度固定为5 ) # 如果需要不同长度的区间(比如3-6周),可这样生成: # target_intervals <- expand.grid( # start = 1:12, # length = 3:6 # ) %>% # mutate(end = start + length - 1) %>% # filter(end <= 12) %>% # select(start, end, length) %>% # arrange(length, start)
4. 计算全覆盖比例
统计每个区间内,所有周都有数据的参与者占比:
interval_full_coverage <- target_intervals %>% rowwise() %>% mutate( # 统计符合全覆盖条件的参与者数量 full_coverage_count = sum(sapply(id_valid_weeks$valid_weeks, function(x) all(start:end %in% x))), total_participants = n_distinct(exdata2$id), full_coverage_ratio = full_coverage_count / total_participants ) %>% ungroup() # 查看结果 print(interval_full_coverage)
5. 计算整体覆盖比例
统计区间内实际观测数占该区间最大潜在观测数的比例:
interval_overall_coverage <- target_intervals %>% rowwise() %>% mutate( # 统计区间内的实际观测数 actual_observations = exdata2 %>% filter(week >= start & week <= end) %>% nrow(), # 计算该区间的最大潜在观测数 potential_observations = n_distinct(exdata2$id) * (end - start + 1), overall_coverage_ratio = actual_observations / potential_observations ) %>% ungroup() # 查看结果 print(interval_overall_coverage)
6. 可视化结果(可选)
把覆盖比例做成柱状图,更直观对比不同区间:
# 全覆盖比例可视化 ggplot(interval_full_coverage, aes(x = factor(paste(start, end, sep="-")), y = full_coverage_ratio)) + geom_col(fill = "#2E8B57") + labs(title = "各周区间全覆盖参与者比例", x = "周区间", y = "比例") + theme(axis.text.x = element_text(angle = 45, hjust = 1)) # 整体覆盖比例可视化 ggplot(interval_overall_coverage, aes(x = factor(paste(start, end, sep="-")), y = overall_coverage_ratio)) + geom_col(fill = "#4682B4") + labs(title = "各周区间整体观测覆盖比例", x = "周区间", y = "比例") + theme(axis.text.x = element_text(angle = 45, hjust = 1))
适配示例数据
你的示例数据是10周,只需调整target_intervals的start范围为1到6(10-5+1=6):
target_intervals <- tibble( start = 1:6, end = start + 4 )
再按上述步骤运行即可得到对应结果。
内容的提问来源于stack exchange,提问作者Sointu
相关产品推荐
相关产品推荐

