You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

纵向(每周)数据不同时间区间的数据覆盖度探究

计算不同周区间的数据覆盖度(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 21:53:19