【问题标题】:Imputing missing values linearly in R在 R 中线性地估算缺失值
【发布时间】:2014-03-27 16:09:03
【问题描述】:

我有一个缺失值的数据框:

X   Y   Z
54  57  57
100 58  58
NA  NA  NA
NA  NA  NA
NA  NA  NA
60  62  56
NA  NA  NA
NA  NA  NA
69  62  62

我想从已知值线性估算 NA 值,以便数据框看起来:

X   Y    Z
54  57  57
100 58  58
90  59  57.5
80  60  57
70  61  56.5
60  62  56
63  62  58
66  62  60
69  60  62

谢谢

【问题讨论】:

  • Y 列的最后一个值不应该是 62 吗?

标签: r missing-data


【解决方案1】:

Base R 的approxfun() 返回一个函数,该函数将线性插值它所传递的数据。

## Make easily reproducible data
df <- read.table(text="X   Y   Z
54  57  57
100 58  58
NA  NA  NA
NA  NA  NA
NA  NA  NA
60  62  56
NA  NA  NA
NA  NA  NA
69  62  62", header=T)

## See how this works on a single vector
approxfun(1:9, df$X)(1:9)
# [1]  54 100  90  80  70  60  63  66  69

## Apply interpolation to each of the data.frame's columns
data.frame(lapply(df, function(X) approxfun(seq_along(X), X)(seq_along(X))))
#     X  Y    Z
# 1  54 57 57.0
# 2 100 58 58.0
# 3  90 59 57.5
# 4  80 60 57.0
# 5  70 61 56.5
# 6  60 62 56.0
# 7  63 62 58.0
# 8  66 62 60.0
# 9  69 62 62.0

【讨论】:

  • 您可能应该将其作为一个单独的问题提出。 (使用 rleinverse.rle 不会太难,除了这些函数处理 NA 的方式,这将需要稍微复杂的方法。)
  • 那么我怎样才能对插值施加约束。假设 NAs 超过 10 个连续条目应该保持 NAs 而不是估算。
  • 谢谢,刚刚问了这个问题。
【解决方案2】:

我可以推荐我正在维护的 imputeTS 包(即使它用于时间序列插补)

对于这种情况,它会像这样工作:

library(imputeTS)
df$X <- na_interpolation(df$X, option ="linear")
df$Y <- na_interpolation(df$Y, option ="linear")
df$Z <- na_interpolation(df$Z, option ="linear")

如前所述,该软件包需要时间序列/向量输入。 (这就是为什么必须单独调用每一列的原因)

该软件包还提供了许多其他插补功能,例如样条插值。

【讨论】:

  • 欢迎来到 Stack Overflow!您已经快速连续发布了几个答案,都推荐 imputeTS 包。也许你只是一个大粉丝,但如果你不止于此,你应该在答案本身中报告任何从属关系。您可能想阅读帮助页面中的How not to be a spammer (aka how not to appear as one)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-21
  • 2019-08-31
  • 2014-04-12
  • 2017-06-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多