【问题标题】:Is there a way to calculate missing values by combining other known values?有没有办法通过组合其他已知值来计算缺失值?
【发布时间】:2022-12-30 02:00:18
【问题描述】:

我有一个包含长格式纵向数据的数据集。对于每个 id,我都有自他们的基线评估以来的年数。对于某些评估,我有它发生的年份,但并非所有评估都有此信息。我正在尝试根据两次评估之间的间隔时间来填补缺失的年份。

   id    years_since_baseline      study_year 
1  1                  3.09              NA
2  1                  3.87              NA
3  1                  4.91              2021
4  1                  6.36              NA
5  2                  0                 2018
6  2                  1.02              NA
7  2                  2.40              NA
8  3                  13.9              NA
9  3                  15.0              NA
10 3                 15.71              2017

理想情况下,我可以使用 years_since_baseline(例如,对于第 6 行,study_year = 2018 + 1.02 = 2019.02)来计算缺失的学习年份,结果如下所示:

   id    years_since_baseline      study_year 
1  1                  3.09              2019.08
2  1                  3.87              2019.96
3  1                  4.91              2021
4  1                  6.36              2022.45
5  2                  0                 2018
6  2                  1.02              2019.02
7  2                  2.40              2020.40
8  3                  13.9              2015.19
9  3                  15.0              2016.29
10 3                 15.71              2017

然而,带有年份信息的评估因 id 而异——有些将其作为第一次评估,有些在中间,有些在最后一次评估。此外,我还必须计算每次评估之间经过的时间。

我尝试使用 group_by、fill 和 lag 的组合来计算缺失的年份,但没有成功。

【问题讨论】:

    标签: r dplyr time missing-data


    【解决方案1】:

    您可以使用 mutate()group_by() 来计算每组中所有行的基线年份的估计值(我包括 mean() 以防万一每个 id 在当前研究年份有不止一行)。

    然后将此列与 years_since_baseline 一起使用以计算缺失的 study_year 值。

    have <- data.frame(id = c(1, 1, 1, 1, 2, 2, 2, 3, 3, 3),
                       years_since_baseline = c(3.09,  3.87, 4.91, 6.36, 0, 1.02, 2.4, 13.9, 15, 15.71),
                       study_year = c(NA,  NA, 2021, NA, 2018, NA, NA, NA, NA, 2017))
    
    want <- have %>% 
        group_by(id) %>% 
        mutate(
         # calculate estimated baseline year
            est_baseyear = mean(ifelse(!is.na(study_year), study_year - years_since_baseline, NA), na.rm=TRUE),
         # use this to calculate a new study year for rows where it is missing
            study_year = ifelse(is.na(study_year), est_baseyear + years_since_baseline, study_year)
               ) %>% 
         # drop the estimate column
        select(-est_baseyear)
    
    

    我认为这会提供您所需的输出。但是,我担心原始的 study_year 变量是一个整数,因此这些计算可能会使结果偏向较早的一年。也许在 study_year 的计算中使用 round(est_baseyear + years_since_baseline) 来减轻这种情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-21
      • 2021-03-17
      • 2018-09-26
      • 1970-01-01
      • 2023-02-17
      • 2019-06-28
      • 1970-01-01
      • 2018-05-08
      相关资源
      最近更新 更多