R语言approx函数相同输入为何返回不同线性插值结果?
approx插值结果不同的真相 核心问题:传入approx的x-y序列并非完全一致
你看到unlist(fp_st_4_main[[1]], fp_st_4_main_extr[[1]])和unlist(fp_st_3_main[[1]], fp_st_3_main_extr[[1]])的数值结果一致,但这是合并两个子向量后展平的结果。而你实际传给approx的是直接拼接的向量:c(0, fp_st_4_main[[1]], fp_st_4_main_extr[[1]], 1)和c(0, fp_st_3_main[[1]], fp_st_3_main_extr[[1]], 1)——这两个拼接后的向量,很可能元素顺序完全不同,只是数值集合相同。
approx的关键行为:自动按x排序
R的approx函数处理x参数时,如果x不是严格递增的,会先将x和y按照x的升序重新排序,再执行线性插值。如果两组拼接后的x序列顺序不同,排序后y值与x的配对关系会发生变化,最终导致插值结果不同。
举个简单的场景验证:
假设第一组x拼接后是c(0, 0.2, 0.1, 1),对应y是c(0, 0.5, 0.4, 1);第二组x拼接后是c(0, 0.1, 0.2, 1),对应y是c(0, 0.4, 0.5, 1)。此时两组x的数值集合一致,但顺序不同,排序后x-y的配对关系一致,插值结果相同。但如果第二组的y是c(0, 0.5, 0.4, 1),排序后y与x的配对就会错乱,插值结果必然不同——这正是你遇到的情况:fp_st_4_main[[1]]与fp_st_3_main[[1]]的元素顺序不同,对应的tp_st_4_main[[1]]与tp_st_3_main[[1]]的元素顺序也不同,导致拼接后的x-y配对在排序后对应关系混乱。
验证方法
直接输出拼接后的完整x、y序列,检查它们的顺序是否一致:
# 生成两组完整的x、y序列 x4 <- c(0, fp_st_4_main[[1]], fp_st_4_main_extr[[1]], 1) x3 <- c(0, fp_st_3_main[[1]], fp_st_3_main_extr[[1]], 1) y4 <- c(0, tp_st_4_main[[1]], tp_st_4_main_extr[[1]], 1) y3 <- c(0, tp_st_3_main[[1]], tp_st_3_main_extr[[1]], 1) # 检查序列是否完全一致(包括顺序) identical(x4, x3) identical(y4, y3)
如果identical返回FALSE,则说明顺序差异是问题根源。
解决方法
在传入approx前,手动对x和y按x升序排序,确保两组的x-y配对完全一致:
my_out <- seq(0,1,0.01) # 处理第一组 x4 <- c(0, fp_st_4_main[[1]], fp_st_4_main_extr[[1]], 1) y4 <- c(0, tp_st_4_main[[1]], tp_st_4_main_extr[[1]], 1) ord4 <- order(x4) intrapulation_my4 <- approx(x4[ord4], y4[ord4], method = "linear", xout = my_out ) # 处理第二组 x3 <- c(0, fp_st_3_main[[1]], fp_st_3_main_extr[[1]], 1) y3 <- c(0, tp_st_3_main[[1]], tp_st_3_main_extr[[1]], 1) ord3 <- order(x3) intrapulation_my3 <- approx(x3[ord3], y3[ord3], method = "linear", xout = my_out ) # 此时两组结果应完全一致 identical(intrapulation_my4$y, intrapulation_my3$y)
内容的提问来源于stack exchange,提问作者liza read

