线性插值与外推问题修复请求:现有R代码无法实现外推
修复线性外推问题的R代码方案
你的问题出在na.approx的rule=2参数上——这个参数只是用最近的端点值填充NA,不是真正的线性外推,所以2010-2013会重复2014的数据,2023重复2022的数据。
要实现真正的线性插值+外推,应该用zoo包的na.extrapolate函数,它会基于现有数据拟合线性趋势,自动完成中间插值和前后外推。
修改后的完整代码
# 加载所需包 library(tidyverse) library(zoo) # 原始数据集 df <- data.frame( year = c(2014, 2022), cities = rep(c("City1", "City2", "City3", "City4", "City5"), each = 2), population = c(100, 200, 150, 250, 120, 220, 170, 270, 130, 230), mean_income = c(50000, 60000, 55000, 65000, 48000, 58000, 53000, 63000, 49000, 59000), col1 = c(10, 20, 15, 25, 12, 22, 17, 27, 13, 23), col2 = c(30, 40, 35, 45, 32, 42, 37, 47, 33, 43), col100 = c(1000, 1100, 1050, 1150, 1020, 1120, 1070, 1170, 1030, 1130) ) # 生成2010-2023的完整年份序列 all_years <- seq(2010, 2023, by = 1) # 执行线性插值+外推(处理所有数值列,可按需调整) result_df <- df %>% complete(cities, year = all_years) %>% group_by(cities) %>% arrange(year) %>% # 用na.extrapolate做线性外推,method="linear"指定线性模型 mutate( across( c(population, mean_income, starts_with("col")), ~ na.extrapolate(., method = "linear"), .names = "extrapolated_{.col}" ) ) # 查看结果(以City1为例验证外推值) filter(result_df, cities == "City1") %>% print(n=14)
关键修改说明
- 替换函数:把
na.approx换成na.extrapolate,并指定method="linear"确保用线性趋势外推(默认是样条,如果你需要线性就必须加这个参数)。 - 扩展处理列:原代码只处理了
starts_with("col")的列,我把population和mean_income也加进去了,如果你不需要可以删掉,或者调整成你需要的列范围。 - 验证逻辑:以City1的population为例,2014是100,2022是200,8年增长100,每年增长12.5。外推后2010的值是
100 - 4*12.5 = 50,2023的值是200 + 12.5 = 212.5,完全符合线性趋势。
内容的提问来源于stack exchange,提问作者SiH
相关产品推荐
相关产品推荐

