ropensci/tsbox

tslist: Use ids to name single elements if possible

felicitaskemeny opened this issue · 6 comments

Erlaube mir die folgende Issue anhand eines Kommentars von @petersteiner zu eröffnen:

# TODO: mit Christoph schauen, dass tsbox beim Umwandeln von Tibbles mit nur
# einer Variablen in Zeitreihen den Variablennamen an die Zeitreihe weitergibt
# Momentan hat es in Y_raw genau einen Jahresindikator, beim Umwandeln mittels
# ts_ts() geht deshalb der Zeitreihenname verloren. Damit dies nicht geschieht
# und damit die Prozedur auch läuft, wenn ein weiterer Jahresindikator hinzu
# käme, wird die folgende Hilfskonstruktion gemacht:

n <- length(unique(filter(Y_raw, !grepl("^kons_", id))$id))
Y_dum <- Y_raw[0, ]
if(n == 1){
  Y_dum <- tibble(
    time = as.Date("1995-01-01"), id = "dummy", value = NA_real_
  )
}

Vielleicht kann man das vereinfachen?

Ich glaube, mit unfreeze() braucht man das nicht mehr. Ist nicht unbedingt ein Problem von tsbox.

Heisst das, ich kann den folgenden Code (aus dem estim-File Kons) vereinfachen und wenn ja, wie?

# === Daten einlesen ===========================================================
inp_pre <- unfreeze(QSPath("kons"), "tbl")
# path <- file.path(getOption("QSPATH"), "kons/frozen")

Y_raw <- inp_pre$year %>%
  filter(!is.na(value))
Xq_raw <- inp_pre$quarter%>%
  filter(!is.na(value))
Xm_raw <- inp_pre$month %>%
  filter(!is.na(value))

inp <- bind_rows(Y_raw, Xq_raw, Xm_raw)

Y <- Y_raw %>%
  filter(grepl("^kons_", id)) %>%
  mutate(id = gsub("^kons_", "", id)) %>%
  ts_ts() %>%
  window(start = start_q, end = bfs_y)

# TODO: mit Christoph schauen, dass tsbox beim Umwandeln von Tibbles mit nur
# einer Variablen in Zeitreihen den Variablennamen an die Zeitreihe weitergibt
# Momentan hat es in Y_raw genau einen Jahresindikator, beim Umwandeln mittels
# ts_ts() geht deshalb der Zeitreihenname verloren. Damit dies nicht geschieht
# und damit die Prozedur auch läuft, wenn ein weiterer Jahresindikator hinzu
# käme, wird die folgende Hilfskonstruktion gemacht:
n <- length(unique(filter(Y_raw, !grepl("^kons_", id))$id))
Y_dum <- Y_raw[0, ]
if(n == 1){
  Y_dum <- tibble(
    time = as.Date("1995-01-01"), id = "dummy", value = NA_real_
  )
}

Xy <- Y_raw %>%
  bind_rows(Y_dum) %>%
  filter(!grepl("^kons_", id)) %>%
  ts_ts()

Xq <- Xq_raw %>%
  # Bei adjustierten Zeitreihen das Präfix 'adj_' entfernen
  mutate(id = gsub("^adj_", "", id)) %>%
  ts_ts() %>%
  window(start = start_q, end = actual_q)

Xm <- Xm_raw %>%
  ts_ts() %>%
  ta(conversion = "average", to = "quarterly") %>%
  window(start = start_q, end = actual_q)

If a single series has an id, it should be used to label the component.

something like this:

  tl <- ts_tslist(x)
  if (length(tl) == 1) names(tl) <- unique(x$id)

If a single series is named, this will now be used as the element's name in the tslist.

E.g.,

library(tsbox)
ts_tslist(ts_pick(ts_tbl(ts_c(mdeaths, fdeaths)), "mdeaths"))
#> $mdeaths
#>       Jan  Feb  Mar  Apr  May  Jun  Jul  Aug  Sep  Oct  Nov  Dec
#> 1974 2134 1863 1877 1877 1492 1249 1280 1131 1209 1492 1621 1846
#> 1975 2103 2137 2153 1833 1403 1288 1186 1133 1053 1347 1545 2066
#> 1976 2020 2750 2283 1479 1189 1160 1113  970  999 1208 1467 2059
#> 1977 2240 1634 1722 1801 1246 1162 1087 1013  959 1179 1229 1655
#> 1978 2019 2284 1942 1423 1340 1187 1098 1004  970 1140 1110 1812
#> 1979 2263 1820 1846 1531 1215 1075 1056  975  940 1081 1294 1341
#> 
#> attr(,"class")
#> [1] "tslist" "list"

Created on 2021-09-18 by the reprex package (v2.0.0)

@petersteiner have you seen this?