Как вычислять годовые возвраты, когда есть недостающая стоимость?

У меня есть рама данных о запасе ежедневно, с которого обращение получения годовых возвратов:

> head(df)
        Date  .SXQR  .SXTR  .SXNR  .SXMR  .SXAR  .SX3R  .SX6R  .SXFR  .SXOR  .SXDR
1 2000-01-03 364.94 223.93 489.04 586.38 306.56 246.81 385.36 403.82 283.78 455.39
2 2000-01-04 345.04 218.90 474.05 566.15 301.13 239.24 374.64 390.41 275.93 434.92
3 2000-01-05 338.22 215.88 464.20 542.29 298.22 239.55 373.26 383.48 272.54 430.05
4 2000-01-06 343.13 218.18 470.82 529.33 300.69 249.75 377.26 383.48 272.47 434.15
5 2000-01-07 349.46 220.10 478.87 531.65 306.50 255.17 381.19 390.23 273.76 447.02
6 2000-01-10 356.20 223.01 484.07 581.82 310.84 252.75 387.74 393.75 278.76 453.80

Я способен вычислять это с:

percent_change2 <- function(x)last(x)/first(x) - 1 # que son last y first?
> yearly_return <- df %>% 
+     group_by(gr = floor_date(Date, unit = "year")) %>%
+     summarize_at(vars(-Date, -gr), percent_change2) %>%
+     ungroup()

Но он возвращает мне Nas в некие годы. Действительно:

introducir la descripción de la imagen aquí

Тогда, когда я пробую производить xts, у меня есть проблемы:

> # Generamos el xts, indicando la columna con la info de tiempo
> yearly_return <- xts(monthly_return[,-1], order.by=monthly_return$gr)
Error in xts(monthly_return[, -1], order.by = monthly_return$gr) : 
  order.by requires an appropriate time-based object

Воспроизводить ошибку

Файл данных здесь.

Для rerproducir df:

library(dplyr)
library(lubridate)

df <- read.xlsx("Data.xlsx", sheet = "Sector-STOXX600", startRow = 2,colNames = TRUE, detectDates = TRUE, skipEmptyRows = FALSE)
df[2:19] <- data.matrix(df[2:19])

Обновление

Даже, если у меня нет больше проблем с недостающими данными, я все еще не могу вычислять годовые возвраты.

> # Replacing missing values
> nas <- which(apply(df[, -1], 1, FUN=function(x) any(is.na(x))))
> # Vemos de forma ordenada con los valores anteriores y posteriores
> # Solo para verificar 
> ver <- c(nas, nas - 1, nas + 1)
> ver <- ver[order(ver)]
> # Imputamos con el promedio entre el valor anterior y el posterior
> df[nas, -1] <- (df[nas-1,-1] + df[nas+1,-1])/2
> 
> yearly_return <- df %>% 
+   group_by(gr = floor_date(Date, unit = "year")) %>%
+   summarize_at(vars(-Date, -gr), percent_change2) %>%
+   ungroup() %>%
+ 
+ # Generamos el xts, indicando la columna con la info de tiempo # ISSUE : there is nas
+ yearly_return <- xts(yearly_return[,-1], order.by=yearly_return$gr)
Error in xts(yearly_return[, -1], order.by = yearly_return$gr) : 
  object 'yearly_return' not found

2
задан 19.03.2019, 20:22
1 ответ

Она imputaciГіn недостающей стоимости это длинная и глубокая тема, не sГ©, если были написаны книги, но capГ-tulos полные на этом, страховке. Есть много paqueterГ - чтобы для манипулировать особенно этой темой: MICE, Amelia, missForest, Hmisc, mi, tidyimpute, и т.д. я комментирую это Тебе просто для того, чтобы размеры величина проблемы.

В принципе, segГєn то, что ты говоришь ты alcanzarГ - чтобы с использовать средний показатель между предыдущей стоимостью и следующим. Это относительно простое решения. Следующий cГіdigo это делает, но понимая, что из-за каждых NA, у тебя есть предыдущая стоимость и последующий один, которого нет NA, что я смог проверять, что действительно в твоем случае он asГ-. Если у тебя были "пустоты" NA´s mГЎs большие, или если бы первый или Гєltimo стоимость они это пошли, нужно думать одну soluciГіn mГЎs сложная.

Сначала мы получаем линии dГіnde какая-то из колонн снаружи NA

nas <- which(apply(df[, -1], 1, FUN=function(x) any(is.na(x))))

Можем проверять их:

# Vemos de forma ordenada con los valores anteriores y posteriores
# Solo para verificar 
ver <- c(nas, nas - 1, nas + 1)
ver <- ver[order(ver)]
df[ver,]


# A tibble: 21 x 19
   Date                .SXQR .SXTR .SXNR .SXMR .SXAR .SX3R .SX6R .SXFR .SXOR .SXDR .SX4R
   <dttm>              <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
 1 2001-01-22 00:00:00  353.  223.  421.  540.  289.  282.  400.  469.  280.  529.  424.
 2 2001-01-23 00:00:00  354.  222.   NA    NA    NA    NA    NA    NA    NA    NA    NA 
 3 2001-01-24 00:00:00  354.  225.  426.  548.  287.  282.  400.  481.  282.  531.  425.
 4 2001-02-21 00:00:00  342.  226   406.  487.  310.  298.  411.  454.  283.  562.  440.
 5 2001-02-22 00:00:00  343.  227.   NA    NA    NA    NA    NA    NA    NA    NA    NA 
 6 2001-02-23 00:00:00  335.  226.  399.  487.  300.  298.  403.  440.  283.  553.  432.
 7 2003-04-30 00:00:00  262.  131.  184.  193.  193.  254.  293.  242.  202.  363.  282.
 8 2003-05-01 00:00:00  261.  131.   NA    NA    NA    NA    NA    NA    NA    NA    NA 
 9 2003-05-02 00:00:00  262.  132.  184.  190.  193.  246.  296.  241.  203.  371.  283.
10 2003-12-23 00:00:00  317.  174.  231.  235.  245.  264.  337.  296.  249.  401.  327.
# ... with 11 more rows, and 7 more variables: .SXRR <dbl>, .SXER <dbl>, .SXKR <dbl>,
#   .SX7R <dbl>, .SX8R <dbl>, .SXIR <dbl>, .SXPR <dbl>

И сейчас sГ - мы делаем она imputaciГіn конец:

# Imputamos con el promedio entre el valor anterior y el posterior
df[nas, -1] <- (df[nas-1,-1] + df[nas+1,-1])/2
# Resultado
df[ver,]

# A tibble: 21 x 19
   Date                .SXQR .SXTR .SXNR .SXMR .SXAR .SX3R .SX6R .SXFR .SXOR .SXDR .SX4R
   <dttm>              <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
 1 2001-01-22 00:00:00  353.  223.  421.  540.  289.  282.  400.  469.  280.  529.  424.
 2 2001-01-23 00:00:00  353.  224.  423.  544.  288.  282.  400.  475.  281.  530.  425.
 3 2001-01-24 00:00:00  354.  225.  426.  548.  287.  282.  400.  481.  282.  531.  425.
 4 2001-02-21 00:00:00  342.  226   406.  487.  310.  298.  411.  454.  283.  562.  440.
 5 2001-02-22 00:00:00  338.  226.  402.  487.  305.  298.  407.  447.  283.  558.  436.
 6 2001-02-23 00:00:00  335.  226.  399.  487.  300.  298.  403.  440.  283.  553.  432.
 7 2003-04-30 00:00:00  262.  131.  184.  193.  193.  254.  293.  242.  202.  363.  282.
 8 2003-05-01 00:00:00  262.  131.  184.  192.  193.  250.  294.  242.  202.  367.  282.
 9 2003-05-02 00:00:00  262.  132.  184.  190.  193.  246.  296.  241.  203.  371.  283.
10 2003-12-23 00:00:00  317.  174.  231.  235.  245.  264.  337.  296.  249.  401.  327.
# ... with 11 more rows, and 7 more variables: .SXRR <dbl>, .SXER <dbl>, .SXKR <dbl>,
#   .SX7R <dbl>, .SX8R <dbl>, .SXIR <dbl>, .SXPR <dbl>
2
ответ дан 02.12.2019, 05:28
  • 1
    Действительно интересный @PatricioMoracho, поскольку опыт работы была compañ í в который perdió - в бедствии - какие-то из Ваших реестров, соответствующих Вашим продажам каких-то филиалов, и дата оставалась, как он выставляется в этом случае: с vací вы (NA), в таком этом особенном случае как добро señ крылья в одном из твоих комментариев, было нужно брать несколько переменных, чтобы моделировать поведению histó богатые. –  Hubert Ronald 18.03.2019, 22:54
  • 2
    Привет @HubertRonald!, leí немного (мало) из этой темы, и есть действительно сложные алгоритмы для этого. Очевидно это очень тонкая тема. –  Patricio Moracho 18.03.2019, 23:07
  • 3
    Большое спасибо Патрисио Морачо! Однако, в то время как у меня сейчас есть полный dataframe todaví в tengo проблема, чтобы вычислять yearly_return. Но не rstudio не я день сообщение ошибки, которая помогает мне понимать потому что. Actualicé вопрос –  IggyPass 19.03.2019, 20:20
  • 4
    @ThePassenger, тема состоит в том, что после ungroup() %>% ты продолжаешь считать открытым pipe, удаляет этот конечный pipe, я думаю, что deberí чтобы функционировать. –  Patricio Moracho 19.03.2019, 20:30
  • 5
    @PatricioMoracho, Если точно! Сожалею, не sabí в и я делаю montó n копирования có я говорю, чтобы прибывать в мой конец, но читаю все ответы, чтобы понимать лучше. –  IggyPass 20.03.2019, 00:10