【问题标题】:Interpolating data above the maximum value in a panel with R用 R 在面板中插值高于最大值的数据
【发布时间】:2020-11-07 01:16:35
【问题描述】:

我有一个缺少需要插值的值的面板。

a <- data.frame(id= c(1,1,1,1,1,1,1,2,2,2,2,2,2,2), year=1:7, index=c(1,NA,NA,NA,3,NA,NA, 2,NA,NA,NA,5,NA,NA))

问题是我没有最终值,所以我想使用相同的插值线来预测高于最后一次观察报告的值。此外,插值应该是“按 id”,而不是将下一个 id 的第一次观察视为行的一部分。

我已经尝试了基本的插值,但它确实停止在最新的值上,或者使用下一个 id 进行预测:

a <- na.approx(a)

我得到的输出:

       id year    index
 [1,]  1    1 1.000000
 [2,]  1    2 1.500000
 [3,]  1    3 2.000000
 [4,]  1    4 2.500000
 [5,]  1    5 3.000000
 [6,]  1    6 2.666667
 [7,]  1    7 2.333333
 [8,]  2    1 2.000000
 [9,]  2    2 2.750000
[10,]  2    3 3.500000
[11,]  2    4 4.250000
[12,]  2    5 5.000000
[13,]  2    6       NA
[14,]  2    7       NA

想要的输出:

        id year    index
 [1,]  1    1 1.000000
 [2,]  1    2 1.500000
 [3,]  1    3 2.000000
 [4,]  1    4 2.500000
 [5,]  1    5 3.000000
 [6,]  1    6 3.500000
 [7,]  1    7 4.000000
 [8,]  2    1 2.000000
 [9,]  2    2 2.750000
[10,]  2    3 3.500000
[11,]  2    4 4.250000
[12,]  2    5 5.000000
[13,]  2    6 5.750000
[14,]  2    7 6.500000
    

【问题讨论】:

  • 我不确定这是否清楚,但是对于“相同的插值线”,我的意思是我想继续预测 NA,假设斜率在最后一个观察点之后是相同的
  • 我收到此错误:0(非 NA)案例

标签: r interpolation


【解决方案1】:

使用lm,您可以获得这个简单插值所使用的斜率,然后使用该斜率通过predict 生成新值。但也许有更简单的解决方案

mod <- lm(index ~ year, a)

a[,2] <- predict(mod, newdata=data.frame(year=a$year))

编辑 1

不,对于每个id,我们将运行不同的 lm。为此,我们在循环中选择具有唯一 ida 部分,并仅使用该部分运行 lm:

for(i in unique(a$id)){
  ai = a[a$id==i,]
  mod = lm(index ~ year, ai)
  a[a$id==i,3] = predict(mod, newdata=data.frame(year=ai$year))}

【讨论】:

  • 感谢您的回答,我的问题不够笼统。我编辑了,对不起
  • 好吧,这很聪明。我认为它应该可以工作,但我现在收到此错误:0 (non-NA) case
  • 我的猜测是,如果id 充满了 NA,则可能会发生此错误,因此您无法在没有观察的情况下运行回归。为了帮助你解决这个问题,我需要更多关于你正在做的事情的背景信息。例如,您可以接受该错误,并忽略该特定 ID,或者使用其他 id 的截距和斜率的平均值,但这是任意的。不客气!
  • “平坡”是指坡度系数。 = 0?如果是,那么我不知道为什么会发生这种情况......也许试试truncround 看看问题是否仍然存在。
  • 是的,我的意思是 coef=0,实际上使用 round() 解决了它。再次感谢
【解决方案2】:

假设以下数据根据 cmets 从问题中修改,我们定义一个函数,如果所有 index 值都是 NA,则返回 NA,否则返回 na.spline,然后按 id 应用它:

library(zoo)

a <- data.frame(id= c(1,1,1,1,1,1,1,2,2,2,2,2,2,2), year=1:7, 
  index=c(NA,NA,NA,NA,NA,NA,NA, 2,NA,NA,NA,5,NA,NA))

na_spline <- function(x) if (all(is.na(x))) NA else na.spline(x)
transform(a, index = ave(index, id, FUN = na_spline))
##    id year index
## 1   1    1    NA
## 2   1    2    NA
## 3   1    3    NA
## 4   1    4    NA
## 5   1    5    NA
## 6   1    6    NA
## 7   1    7    NA
## 8   2    1  2.00
## 9   2    2  2.75
## 10  2    3  3.50
## 11  2    4  4.25
## 12  2    5  5.00
## 13  2    6  5.75
## 14  2    7  6.50

【讨论】:

  • 对不起,我的第一篇文章不够笼统,我编辑了它
  • 很奇怪,我一直收到这个错误:splinefun(x[!na], y[!na], ...) 中的错误:非 NA 点为零
  • 可能错误来自缺少所有索引值的 id。而@ricardo 的答案通过仅针对“空” id 获取错误,同时计算至少有 2 个“索引”值的剩余 id 来解决这个问题
  • 对不起,我的意思是可能存在缺少所有索引值的 id。我没有意识到
  • 您的答案比 ricardo 的答案更清晰,但是通过 id 循环,他解决了缺少索引的问题。还是非常感谢
【解决方案3】:

这行得通吗:

library(dplyr)
library(tidyr)
library(purrr)
a %>% mutate(index = replace_na(index, 0)) %>% 
      mutate(index = accumulate(index, ~ .5 + .x))
  year index
1    1   1.0
2    2   1.5
3    3   2.0
4    4   2.5
5    5   3.0
6    6   3.5
7    7   4.0
> 

【讨论】:

  • 对不起,我的第一篇文章不够笼统,我编辑了它。
【解决方案4】:

看起来值遵循线性模式。然后您可以使用fit=lm(index~year, data=a),然后使用a$index=fit$coef[2]*a$year+fit$coef[1] 预测值。

【讨论】:

  • 对不起,我的第一篇文章不够笼统,我编辑了它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-05
  • 1970-01-01
  • 2021-03-06
  • 2014-10-20
  • 1970-01-01
  • 2018-10-16
  • 1970-01-01
相关资源
最近更新 更多