library(haven)
library(dplyr)
library(ggplot2)
library(lmtest)
library(forecast)
library(sandwich)
library(nlme)

1. Dáta a príprava časového radu

dat <- read_dta("all.dta")

dat <- dat %>%
  mutate(date = as.Date(paste(year, month, day, sep = "-"))) %>%
  filter(!is.na(date))

Vyberieme hráča s najvyšším počtom pozorovaní, aby sme mali dostatočne dlhý časový rad.

player_pick <- dat %>% count(player, sort = TRUE) %>% slice(1) %>% pull(player)

d <- dat %>%
  filter(player == player_pick) %>%
  arrange(date) %>%
  filter(!is.na(rankindex), !is.na(b365), !is.na(rankindexdiff)) %>%
  droplevels()

# DÔLEŽITÉ: AR(1) v nlme vyžaduje unikátne hodnoty "času".
# Keď má hráč viac zápasov v rovnaký deň, date nie je unikátny.
# Preto vytvoríme jednoduchý časový index 1..T:
d <- d %>% mutate(t = row_number())

cat("Použitý hráč:", player_pick, "\n")
Použitý hráč: Djokovic N. 
cat("Počet pozorovaní:", nrow(d), "\n")
Počet pozorovaní: 675 
cat("Rozsah dátumov:", format(min(d$date)), "–", format(max(d$date)), "\n")
Rozsah dátumov: 2007-01-02 – 2021-11-20 

2. Základný model (OLS)

Použijeme jednoduchý model:

\[ rankindex_t = \beta_0 + \beta_1 b365_t + \beta_2 rankindexdiff_t + u_t \]

m <- lm(rankindex ~ b365 + rankindexdiff, data = d)
summary(m)

Call:
lm(formula = rankindex ~ b365 + rankindexdiff, data = d)

Residuals:
    Min      1Q  Median      3Q     Max 
-3.1134 -0.5423  0.1437  0.6627  1.6056 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)    6.01219    0.14410  41.723   <2e-16 ***
b365           0.09303    0.06475   1.437    0.151    
rankindexdiff  0.26588    0.02218  11.986   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.963 on 672 degrees of freedom
Multiple R-squared:  0.2141,    Adjusted R-squared:  0.2118 
F-statistic: 91.53 on 2 and 672 DF,  p-value: < 2.2e-16

3. Detekcia autokorelácie

3.1 Graf rezíduí v čase

d <- d %>% mutate(e = resid(m))

ggplot(d, aes(x = date, y = e)) +
  geom_line() +
  labs(
    title = "Rezíduá OLS v čase",
    x = "Dátum", y = "rezíduá"
  )

3.2 Lag-plot rezíduí: e(t) vs e(t−1)

d_lag <- d %>%
  mutate(e_lag1 = dplyr::lag(e, 1)) %>%
  filter(!is.na(e_lag1))

ggplot(d_lag, aes(x = e_lag1, y = e)) +
  geom_point() +
  geom_smooth(method = "lm", se = FALSE) +
  labs(
    title = "Lag-plot rezíduí: e(t) vs e(t-1)",
    x = "e(t-1)", y = "e(t)"
  )

(Voliteľne) pomocná regresia:

summary(lm(e ~ e_lag1, data = d_lag))

Call:
lm(formula = e ~ e_lag1, data = d_lag)

Residuals:
     Min       1Q   Median       3Q      Max 
-2.10462 -0.32983  0.05773  0.37198  1.66452 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) 0.005759   0.021145   0.272    0.785    
e_lag1      0.815752   0.022026  37.035   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.5489 on 672 degrees of freedom
Multiple R-squared:  0.6712,    Adjusted R-squared:  0.6707 
F-statistic:  1372 on 1 and 672 DF,  p-value: < 2.2e-16

3.3 Korelogram (ACF) rezíduí

Acf(resid(m), main = "ACF rezíduí (OLS)")

3.4 Durbin–Watson test

dwtest(m)

    Durbin-Watson test

data:  m
DW = 0.35882, p-value < 2.2e-16
alternative hypothesis: true autocorrelation is greater than 0

3.5 Breusch–Godfrey test (AR(1) až AR(4))

bgtest(m, order = 1)

    Breusch-Godfrey test for serial correlation of order up to 1

data:  m
LM test = 499.02, df = 1, p-value < 2.2e-16
bgtest(m, order = 2)

    Breusch-Godfrey test for serial correlation of order up to 2

data:  m
LM test = 542.46, df = 2, p-value < 2.2e-16
bgtest(m, order = 3)

    Breusch-Godfrey test for serial correlation of order up to 3

data:  m
LM test = 565.28, df = 3, p-value < 2.2e-16
bgtest(m, order = 4)

    Breusch-Godfrey test for serial correlation of order up to 4

data:  m
LM test = 576.46, df = 4, p-value < 2.2e-16
LS0tCnRpdGxlOiAiQ3ZpxI1lbmllIDkg4oCTIERldGVrY2lhIGF1dG9rb3JlbMOhY2llIHJlesOtZHXDrSAtIE7DqW1ldGgiCm91dHB1dDoKICBodG1sX25vdGVib29rOiBkZWZhdWx0Ci0tLQoKYGBge3Igc2V0dXAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmxpYnJhcnkoaGF2ZW4pCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShsbXRlc3QpCmxpYnJhcnkoZm9yZWNhc3QpCmxpYnJhcnkoc2FuZHdpY2gpCmxpYnJhcnkobmxtZSkKYGBgCgojIDEuIETDoXRhIGEgcHLDrXByYXZhIMSNYXNvdsOpaG8gcmFkdQoKYGBge3IgZGF0YX0KZGF0IDwtIHJlYWRfZHRhKCJhbGwuZHRhIikKCmRhdCA8LSBkYXQgJT4lCiAgbXV0YXRlKGRhdGUgPSBhcy5EYXRlKHBhc3RlKHllYXIsIG1vbnRoLCBkYXksIHNlcCA9ICItIikpKSAlPiUKICBmaWx0ZXIoIWlzLm5hKGRhdGUpKQpgYGAKClZ5YmVyaWVtZSBocsOhxI1hIHMgKipuYWp2ecWhxaHDrW0gcG/EjXRvbSBwb3pvcm92YW7DrSoqLCBhYnkgc21lIG1hbGkgZG9zdGF0b8SNbmUgZGxow70gxI1hc292w70gcmFkLgoKYGBge3IgcGljay1wbGF5ZXJ9CnBsYXllcl9waWNrIDwtIGRhdCAlPiUgY291bnQocGxheWVyLCBzb3J0ID0gVFJVRSkgJT4lIHNsaWNlKDEpICU+JSBwdWxsKHBsYXllcikKCmQgPC0gZGF0ICU+JQogIGZpbHRlcihwbGF5ZXIgPT0gcGxheWVyX3BpY2spICU+JQogIGFycmFuZ2UoZGF0ZSkgJT4lCiAgZmlsdGVyKCFpcy5uYShyYW5raW5kZXgpLCAhaXMubmEoYjM2NSksICFpcy5uYShyYW5raW5kZXhkaWZmKSkgJT4lCiAgZHJvcGxldmVscygpCgojIETDlExFxb1JVMOJOiBBUigxKSB2IG5sbWUgdnnFvmFkdWplIHVuaWvDoXRuZSBob2Rub3R5ICLEjWFzdSIuCiMgS2XEjyBtw6EgaHLDocSNIHZpYWMgesOhcGFzb3YgdiByb3ZuYWvDvSBkZcWILCBkYXRlIG5pZSBqZSB1bmlrw6F0bnkuCiMgUHJldG8gdnl0dm9yw61tZSBqZWRub2R1Y2jDvSDEjWFzb3bDvSBpbmRleCAxLi5UOgpkIDwtIGQgJT4lIG11dGF0ZSh0ID0gcm93X251bWJlcigpKQoKY2F0KCJQb3XFvml0w70gaHLDocSNOiIsIHBsYXllcl9waWNrLCAiXG4iKQpjYXQoIlBvxI1ldCBwb3pvcm92YW7DrToiLCBucm93KGQpLCAiXG4iKQpjYXQoIlJvenNhaCBkw6F0dW1vdjoiLCBmb3JtYXQobWluKGQkZGF0ZSkpLCAi4oCTIiwgZm9ybWF0KG1heChkJGRhdGUpKSwgIlxuIikKYGBgCgojIDIuIFrDoWtsYWRuw70gbW9kZWwgKE9MUykKClBvdcW+aWplbWUgamVkbm9kdWNow70gbW9kZWw6CgpcWwpyYW5raW5kZXhfdCA9IFxiZXRhXzAgKyBcYmV0YV8xIGIzNjVfdCArIFxiZXRhXzIgcmFua2luZGV4ZGlmZl90ICsgdV90ClxdCgpgYGB7ciBvbHN9Cm0gPC0gbG0ocmFua2luZGV4IH4gYjM2NSArIHJhbmtpbmRleGRpZmYsIGRhdGEgPSBkKQpzdW1tYXJ5KG0pCmBgYAoKIyAzLiBEZXRla2NpYSBhdXRva29yZWzDoWNpZQoKIyMgMy4xIEdyYWYgcmV6w61kdcOtIHYgxI1hc2UKCmBgYHtyIHJlc2lkLXRpbWV9CmQgPC0gZCAlPiUgbXV0YXRlKGUgPSByZXNpZChtKSkKCmdncGxvdChkLCBhZXMoeCA9IGRhdGUsIHkgPSBlKSkgKwogIGdlb21fbGluZSgpICsKICBsYWJzKAogICAgdGl0bGUgPSAiUmV6w61kdcOhIE9MUyB2IMSNYXNlIiwKICAgIHggPSAiRMOhdHVtIiwgeSA9ICJyZXrDrWR1w6EiCiAgKQpgYGAKCiMjIDMuMiBMYWctcGxvdCByZXrDrWR1w606IGUodCkgdnMgZSh04oiSMSkKCmBgYHtyIGxhZ3Bsb3R9CmRfbGFnIDwtIGQgJT4lCiAgbXV0YXRlKGVfbGFnMSA9IGRwbHlyOjpsYWcoZSwgMSkpICU+JQogIGZpbHRlcighaXMubmEoZV9sYWcxKSkKCmdncGxvdChkX2xhZywgYWVzKHggPSBlX2xhZzEsIHkgPSBlKSkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJMYWctcGxvdCByZXrDrWR1w606IGUodCkgdnMgZSh0LTEpIiwKICAgIHggPSAiZSh0LTEpIiwgeSA9ICJlKHQpIgogICkKYGBgCgooVm9saXRlxL5uZSkgcG9tb2Nuw6EgcmVncmVzaWE6CgpgYGB7ciBsYWctcmVnfQpzdW1tYXJ5KGxtKGUgfiBlX2xhZzEsIGRhdGEgPSBkX2xhZykpCmBgYAoKIyMgMy4zIEtvcmVsb2dyYW0gKEFDRikgcmV6w61kdcOtCgpgYGB7ciBhY2Z9CkFjZihyZXNpZChtKSwgbWFpbiA9ICJBQ0YgcmV6w61kdcOtIChPTFMpIikKYGBgCgojIyAzLjQgRHVyYmlu4oCTV2F0c29uIHRlc3QKCmBgYHtyIGR3fQpkd3Rlc3QobSkKYGBgCgojIyAzLjUgQnJldXNjaOKAk0dvZGZyZXkgdGVzdCAoQVIoMSkgYcW+IEFSKDQpKQoKYGBge3IgYmd9CmJndGVzdChtLCBvcmRlciA9IDEpCmJndGVzdChtLCBvcmRlciA9IDIpCmJndGVzdChtLCBvcmRlciA9IDMpCmJndGVzdChtLCBvcmRlciA9IDQpCmBgYAoKCgoK