заполнить пробелы экспоненциальными оценками - PullRequest
1 голос
/ 23 марта 2020

Я пытаюсь заполнить значения NA числами, которые показывают экспоненциальный рост. Ниже приведен пример того, что я пытаюсь сделать.


library(tidyverse)

expand.grid(X2009H1N1 = "0-17 years",
            type = "Cases",
            month = seq(as.Date("2009-04-12") , to = as.Date("2010-03-12"), by = "month")) %>% 
  bind_cols( data.frame(
    MidLevelRange = c(0,NA,NA,NA,NA,NA,8000000,16000000,18000000,19000000,19000000,19000000),
    lowEst = c(0,NA,NA,NA,NA,NA,5000000,12000000,12000000,13000000,14000000,14000000)
  ))

Я использовал %>% arrange(month, X2009H1N1) %>% group_by(X2009H1N1, type ) %>% mutate(aprox_MidLevelRange = zoo::na.approx(MidLevelRange, na.rm = FALSE)), но результат не выглядит для меня экспоненциальным. Спасибо

Ответы [ 2 ]

1 голос
/ 25 марта 2020

Посмотрите на пакет imputeTS . Он предлагает множество функций вменения для временных рядов. Взгляните на эту бумагу , чтобы получить хороший обзор всех предлагаемых опций

В вашем случае, возможно, подойдет интерполяция Stineman (imputeTS::na_interpolation(x, option ="stine").

Вот пример, который вы предоставили:

x <- expand.grid(
  X2009H1N1 = "0-17 years",
  type = "Cases",
  month = seq(as.Date("2009-04-12"),
    to = as.Date("2010-03-12"),
    by = "month"
  )
) %>%
  bind_cols(data.frame(
    MidLevelRange = c(0, NA, NA, NA, NA, NA, 8000000, 16000000, 18000000, 19000000, 19000000, 19000000),
    lowEst = c(0, NA, NA, NA, NA, NA, 5000000, 12000000, 12000000, 13000000, 14000000, 14000000)
  ))

x %>%
  arrange(month, X2009H1N1) %>%
  group_by(X2009H1N1, type) %>%
  mutate(aprox_MidLevelRange = imputeTS::na_interpolation(MidLevelRange, option = "stine"))

Это дает вам:

# A tibble: 12 x 6
# Groups:   X2009H1N1, type [1]
   X2009H1N1  type  month      MidLevelRange   lowEst aprox_MidLevelRange
   <fct>      <fct> <date>             <dbl>    <dbl>               <dbl>
 1 0-17 years Cases 2009-04-12             0        0                  0 
 2 0-17 years Cases 2009-05-12            NA       NA             593718.
 3 0-17 years Cases 2009-06-12            NA       NA            1335612.
 4 0-17 years Cases 2009-07-12            NA       NA            2289061.
 5 0-17 years Cases 2009-08-12            NA       NA            3559604.
 6 0-17 years Cases 2009-09-12            NA       NA            5336975.
 7 0-17 years Cases 2009-10-12       8000000  5000000            8000000 
 8 0-17 years Cases 2009-11-12      16000000 12000000           16000000 
 9 0-17 years Cases 2009-12-12      18000000 12000000           18000000 
10 0-17 years Cases 2010-01-12      19000000 13000000           19000000 
11 0-17 years Cases 2010-02-12      19000000 14000000           19000000 
12 0-17 years Cases 2010-03-12      19000000 14000000           19000000 

Так что, просто сравнивая функции интерполяции, я думаю, это может быть лучшим вариантом.

Просто нарисуйте различные варианты интерполяции, чтобы увидеть различия. В общем случае это параметры интерполяции:

imputeTS::na_interpolation(x, option ="linear")
imputeTS::na_interpolation(x, option ="spline")
imputeTS::na_interpolation(x, option ="stine")

Параметры линейного / сплайнового значения от imputeTS аналогичны zoo :: ок () / zoo :: сплайн (). Стайн не существует в зоопарке.

1 голос
/ 23 марта 2020

Конечно, ваш результат не экспоненциальный, вы используете функцию na.approx() для вычисления значений с помощью линейной интерполяции. Пакет zoo, который вы используете, предлагает выполнить интерполяцию с использованием сплайн-интерполяции cubi c с использованием функции na.spline(), но эта функция также не дает экспоненциальной кривой.

x <- expand.grid(X2009H1N1 = "0-17 years",
                 type = "Cases",
                 month = seq(as.Date("2009-04-12"), 
                             to = as.Date("2010-03-12"), 
                             by = "month")) %>% 
  bind_cols(data.frame(MidLevelRange = c(0,NA,NA,NA,NA,NA,8000000,16000000,18000000,19000000,19000000,19000000),
                       lowEst = c(0,NA,NA,NA,NA,NA,5000000,12000000,12000000,13000000,14000000,14000000)))

x %>% arrange(month, X2009H1N1) %>% 
  group_by(X2009H1N1, type) %>% 
  mutate(aprox_MidLevelRange = zoo::na.spline(MidLevelRange))

Проблема с cubi c Сплайн-интерполяция состоит в том, что ваши самые низкие значения будут интерполированы как отрицательные, в зависимости от того, ищете ли вы такое поведение или нет:

# A tibble: 8 x 6
# Groups:   X2009H1N1, type [1]
  X2009H1N1  type  month      MidLevelRange   lowEst aprox_MidLevelRange
  <fct>      <fct> <date>             <dbl>    <dbl>               <dbl>
1 0-17 years Cases 2009-04-12             0        0                  0 
2 0-17 years Cases 2009-05-12            NA       NA          -18568160.
3 0-17 years Cases 2009-06-12            NA       NA          -25223342.
4 0-17 years Cases 2009-07-12            NA       NA          -22929832.
5 0-17 years Cases 2009-08-12            NA       NA          -14651914.
6 0-17 years Cases 2009-09-12            NA       NA           -3353875.
7 0-17 years Cases 2009-10-12       8000000  5000000            8000000.
...