如何使用R对日期序列数据进行线性外推补全
线性外推补全年度缺失数据的实现方法
方法一:基于dplyr+线性回归的优先实现
这种方法贴合dplyr的操作逻辑,通过拟合线性模型来外推缺失值:
步骤与代码
- 加载所需包并准备数据
library(dplyr) library(lubridate) library(tidyr) df <- tibble( pop = c(18968, 18956, 18946, 18934, 18923, 18912, 18901, NA, NA, NA, NA, NA), date = c("2020-01-01", "2020-02-01", "2020-03-01", "2020-04-01", "2020-05-01", "2020-06-01", "2020-07-01", "2020-08-01", "2020-09-01", "2020-10-01", "2020-11-01", "2020-12-01") ) %>% mutate(date = as_date(date))
- 拟合线性模型并补全缺失值
# 用前7个月的有效数据拟合线性模型(将日期转为数值型作为自变量) lm_model <- lm(pop ~ as.numeric(date), data = df %>% filter(!is.na(pop))) # 对全量数据预测,替换缺失的pop值 df_complete <- df %>% mutate(pop = ifelse(is.na(pop), predict(lm_model, newdata = .), pop))
说明
- 日期转为数值型是因为线性回归模型要求自变量为数值类型;
predict()函数会自动对newdata中的每一行计算预测值,完美匹配原数据的行顺序。
方法二:使用Hmisc包的approxExtrap函数
针对你提到的approxExtrap,核心是理解xout参数:它指定需要生成外推值的所有x坐标点,具体实现如下:
步骤与代码
library(Hmisc) # 提取已有数据的x(日期转数值)和y(pop) x_observed <- df %>% filter(!is.na(pop)) %>% pull(date) %>% as.numeric() y_observed <- df %>% filter(!is.na(pop)) %>% pull(pop) # 生成全年所有日期对应的数值型x点(即xout参数需要的内容) x_all <- df %>% pull(date) %>% as.numeric() # 执行线性外推 extrap_results <- approxExtrap(x = x_observed, y = y_observed, xout = x_all) # 将外推结果合并回原数据框 df_complete_approx <- df %>% mutate(pop = extrap_results$y)
关键参数解释
x:已有数据的自变量(这里是前7个月的日期数值);y:已有数据的因变量(前7个月的pop值);xout:你需要获取预测值的所有x点(这里是全年12个月的日期数值),函数会基于x和y的线性趋势,计算出xout每个点对应的y值,直接补全缺失部分。
内容的提问来源于stack exchange,提问作者dd_data
相关产品推荐
相关产品推荐

