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

R语言VIM包kNN插补算法返回错误结果的原因问询

问题描述

我理解R语言VIM包中的kNN算法会选取缺失点周围的k个点,通过均值、中位数等方法聚合插补。但执行如下代码后,缺失点的插补结果为1.5而非预期的6,请问原因是什么?

ts_data <- c(1, 2, 3, 4, 5, NA, 7, 8, 9)
imputed_ts <- kNN(as.data.frame(as.table(ts_data)), k = 2, numFun = "mean",imp_var=FALSE)
print(imputed_ts)

输出结果中第6行Freq值为1.5。

原因及解决方法
  • 问题根源在as.table(ts_data)的转换:把原始向量转成table后,生成的数据框会把原向量的位置索引作为Var1列,把向量值作为Freq列。此时数据框的结构是9行,每行包含Var1(1到9)和Freq(对应原始值)。
  • VIM包的kNN()默认基于所有变量的欧氏距离筛选邻近点,缺失点对应的Var1=6,算法会计算其他点与Var1=6的距离,而非你预期的原始时间序列位置邻近性。距离Var1=6最近的两个点是Var1=1(Freq=1)和Var1=2(Freq=2),它们的Var1与6的欧氏距离最小,取这两个点的Freq均值(1+2)/2=1.5,就得到了这个结果。
  • 要实现你预期的“取缺失点前后邻近点插补”,需要明确基于位置筛选邻近点,正确的做法是构造包含位置列和数值列的数据框:
ts_data <- c(1, 2, 3, 4, 5, NA, 7, 8, 9)
# 构造带位置索引的数据框
ts_df <- data.frame(pos = 1:length(ts_data), value = ts_data)
# 执行kNN插补
imputed_ts <- kNN(ts_df, k = 2, numFun = "mean", imp_var = FALSE)
print(imputed_ts)

此时缺失点的pos=6,算法会找到pos=5和pos=7这两个最近邻,它们的value分别是5和7,均值为6,符合你的预期。


内容的提问来源于stack exchange,提问作者Ress

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 14:00:09