#install.packages("tidyverse")
#install.packages("janitor")
#install.packages("rio")
#install.packages("here")
#install.packages("haven")

#install.packages("reshape2")
#install.packages("Synth")
#install.packages("SCtools")
#install.packages("kableExtra")
#install.packages("flextable")
#install.packages("lubridate")



rm(list = ls()) # apaga tudo do enverioment

options(scipen = 999) # deixa números em decimal ao invés da notação estranha do R.

library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.4.3
## Warning: package 'ggplot2' was built under R version 4.4.3
## Warning: package 'tibble' was built under R version 4.4.3
## Warning: package 'tidyr' was built under R version 4.4.3
## Warning: package 'readr' was built under R version 4.4.3
## Warning: package 'purrr' was built under R version 4.4.3
## Warning: package 'dplyr' was built under R version 4.4.3
## Warning: package 'stringr' was built under R version 4.4.3
## Warning: package 'forcats' was built under R version 4.4.3
## Warning: package 'lubridate' was built under R version 4.4.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.2     ✔ tibble    3.3.0
## ✔ lubridate 1.9.4     ✔ tidyr     1.3.1
## ✔ purrr     1.1.0     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(janitor)
## Warning: package 'janitor' was built under R version 4.4.3
## 
## Attaching package: 'janitor'
## 
## The following objects are masked from 'package:stats':
## 
##     chisq.test, fisher.test
library(rio)
## Warning: package 'rio' was built under R version 4.4.3
library(here)
## Warning: package 'here' was built under R version 4.4.3
## here() starts at G:/My Drive/Analysis/UFAL_Saude mental
library(haven)
## Warning: package 'haven' was built under R version 4.4.3
library(flextable)
## Warning: package 'flextable' was built under R version 4.4.3
## 
## Attaching package: 'flextable'
## 
## The following object is masked from 'package:purrr':
## 
##     compose
library(knitr)
## Warning: package 'knitr' was built under R version 4.4.3
library(kableExtra)
## Warning: package 'kableExtra' was built under R version 4.4.3
## 
## Attaching package: 'kableExtra'
## 
## The following objects are masked from 'package:flextable':
## 
##     as_image, footnote
## 
## The following object is masked from 'package:dplyr':
## 
##     group_rows
library(haven)
library(tidyverse)
library(Synth)
## Warning: package 'Synth' was built under R version 4.4.3
## ##
## ## Synth Package: Implements Synthetic Control Methods.
## 
## ## See https://web.stanford.edu/~jhain/synthpage.html for additional information.
library(SCtools)
## Warning: package 'SCtools' was built under R version 4.4.3
## Loading required package: future
## Warning: package 'future' was built under R version 4.4.3
library(lubridate)

nba <- import("PlayerStatistics.csv")
medias_jogadores <- import("nba_per_season.csv")

#Game Score = (Pontos) + (0.4 * FG) - (0.7 * FGA) - (0.4 * (FTA - FT)) + (0.7 * OR) + (0.3 * DR) + ST + (0.7 * BLK) - 0.4 * (PF -T)

nba$gameDate <- as.POSIXct(nba$gameDate, format="%Y-%m-%d %H:%M:%S")

nba$ano <- format(nba$gameDate, "%Y")
nba$mes <- format(nba$gameDate, "%m")
nba$dia <- format(nba$gameDate, "%d")

nba <- nba %>%
  mutate(
    game_score = points +
      0.4 * fieldGoalsMade -
      0.7 * fieldGoalsAttempted -
      0.4 * (freeThrowsAttempted - freeThrowsMade) +
      0.7 * reboundsOffensive +
      0.3 * reboundsDefensive +
      steals +
      0.7 * assists +
      0.7 * blocks -
      0.4 * foulsPersonal -
      turnovers
  )%>%
  mutate(Temporada = case_when(
    as.numeric(mes) > 7 ~ as.numeric(ano) + 1,
    as.numeric(mes) <= 7 ~ as.numeric(ano)
  ))

nbaregular <- nba %>%
  filter(gameType == "Regular Season")

#Kevin Love ----
# 5; 15; 45; 82; 164

nbaregular %>% tabyl(playerteamCity)
##     playerteamCity     n      percent
##            Atlanta 51282 0.0348761767
##          Baltimore  7557 0.0051394109
##             Boston 64968 0.0441838354
##           Brooklyn 13191 0.0089710161
##            Buffalo  6224 0.0042328560
##            Capital   739 0.0005025836
##          Charlotte 33037 0.0224680053
##            Chicago 54426 0.0370143675
##         Cincinnati 11333 0.0077074161
##          Cleveland 49695 0.0337968800
##             Dallas 41883 0.0284840472
##             Denver 45583 0.0310003659
##            Detroit 59519 0.0404780461
##  Ft. Wayne Zollner  4778 0.0032494515
##       Golden State 49094 0.0333881483
##            Houston 48973 0.0333058579
##            Indiana 45696 0.0310772156
##        Kansas City  8453 0.0057487680
##  Kansas City-Omaha  2424 0.0016485288
##        Los Angeles 95174 0.0647265170
##            Memphis 23953 0.0162901030
##              Miami 35205 0.0239424321
##          Milwaukee 54416 0.0370075666
##        Minneapolis  6864 0.0046681112
##          Minnesota 34561 0.0235044566
##         New Jersey 30913 0.0210235024
##        New Orleans 25046 0.0170334371
##           New York 65716 0.0446925399
##      Oklahoma City 19158 0.0130290900
##            Orlando 34229 0.0232786680
##       Philadelphia 62709 0.0426475209
##            Phoenix 52004 0.0353671989
##           Portland 50003 0.0340063466
##          Rochester  4738 0.0032222481
##         Sacramento 37897 0.0257732239
##        San Antonio 45107 0.0306766449
##          San Diego  8042 0.0054692526
##      San Francisco  6774 0.0046069034
##            Seattle 35525 0.0241600596
##          St. Louis  9596 0.0065261065
##           Syracuse  8704 0.0059194696
##            Toronto 29431 0.0200156148
##         Tri-Cities   677 0.0004604183
##               Utah 43140 0.0293389155
##          Vancouver  5361 0.0036459417
##         Washington 46604 0.0316947338
KevinLove <- nbaregular %>%
  filter(playerteamCity == "Cleveland")%>%
  filter(firstName == "Kevin" & lastName == "Love")%>%
  # ordenação por data do jogo, após o filtro
    arrange(gameDate) %>%
  mutate(Temporada = case_when(
    as.numeric(mes) > 7 ~ as.numeric(ano) + 1,
    as.numeric(mes) <= 7 ~ as.numeric(ano)
  ))%>%
  # Adiciona o índice da série temporal, que é importante para a análise
  mutate(game_index = row_number())


linha_central <- 238
evento_indice <- 238

#KevinLove <- KevinLove %>%
# mutate(
#   linha_atual = row_number(),
#   distancia = linha_central - linha_atual,
#   modulo = abs(distancia)
# )

#KevinLove5 <- KevinLove %>%
# filter(modulo <= 5)%>%
# mutate(per = case_when(
#   distancia > 0 ~ "Post",
#   distancia < 0 ~ "Neg",
#   TRUE ~ "Evento"
# ))%>%
# mutate(Med = mean(game_score))

#KevinLove15 <- KevinLove %>%
# filter(modulo <= 15)%>%
# mutate(per = case_when(
#   distancia > 0 ~ "Post",
#   distancia < 0 ~ "Neg",
#   TRUE ~ "Evento"
# ))%>%
# mutate(Med = mean(game_score))

#KevinLove45 <- KevinLove %>%
# filter(modulo <= 45)%>%
# mutate(per = case_when(
#   distancia > 0 ~ "Post",
#   distancia < 0 ~ "Neg",
#   TRUE ~ "Evento"
# ))%>%
# mutate(Med = mean(game_score))

#KevinLove82 <- KevinLove %>%
# filter(modulo <= 82)%>%
# mutate(per = case_when(
#   distancia > 0 ~ "Post",
#   distancia < 0 ~ "Neg",
#   TRUE ~ "Evento"
# ))%>%
# mutate(Med = mean(game_score))

#KevinLove164 <- KevinLove %>%
# filter(modulo <= 164)%>%
# mutate(per = case_when(
#   distancia > 0 ~ "Post",
#   distancia < 0 ~ "Neg",
#   TRUE ~ "Evento"
# ))%>%
# mutate(Med = mean(game_score))

## Gráficos Kevin Love ----

#ggplot(KevinLove5, aes(x = distancia, y = game_score, color = per)) +
# geom_point(size = 2, alpha = 0.7) +
# geom_vline(xintercept = 0, linetype = "dashed", color = "black") + # linha do evento
# geom_hline(aes(yintercept = Med), linetype = "dotted", color = "gray30") + # média geral
# geom_smooth(method = "lm", se = FALSE) + # tendência linear por grupo
# scale_color_manual(values = c("Neg" = "#1f77b4", "Evento" = "#ff7f0e", "Post" = "#2ca02c")) +
# labs(
#   title = "Game Score de Kevin Love - ITC em torno do Evento",
#   subtitle = "Comparação de desempenho antes e depois do evento (±5 jogos)",
#   x = "Distância em jogos do evento (linha 238)",
#   y = "Game Score",
#   color = "Período"
# ) +
# theme_minimal(base_size = 13)

#modelo5 <- lm(game_score ~ distancia * per, data = KevinLove5 %>% filter(per != "Evento"))
#summary(modelo5)

#ggplot(KevinLove15, aes(x = distancia, y = game_score, color = per)) +
# geom_point(size = 2, alpha = 0.7) +
# geom_vline(xintercept = 0, linetype = "dashed", color = "black") + # linha do evento
# geom_hline(aes(yintercept = Med), linetype = "dotted", color = "gray30") + # média geral
# geom_smooth(method = "lm", se = FALSE) + # tendência linear por grupo
# scale_color_manual(values = c("Neg" = "#1f77b4", "Evento" = "#ff7f0e", "Post" = "#2ca02c")) +
# labs(
#   title = "Game Score de Kevin Love - ITC em torno do Evento",
#   subtitle = "Comparação de desempenho antes e depois do evento (±15 jogos)",
#   x = "Distância em jogos do evento (linha 238)",
#   y = "Game Score",
#   color = "Período"
# ) +
# theme_minimal(base_size = 13)

#modelo15 <- lm(game_score ~ distancia * per, data = KevinLove15 %>% filter(per != "Evento"))
#summary(modelo15)


#ggplot(KevinLove45, aes(x = distancia, y = game_score, color = per)) +
# geom_point(size = 2, alpha = 0.7) +
# geom_vline(xintercept = 0, linetype = "dashed", color = "black") + # linha do evento
# geom_hline(aes(yintercept = Med), linetype = "dotted", color = "gray30") + # média geral
# geom_smooth(method = "lm", se = FALSE) + # tendência linear por grupo
# scale_color_manual(values = c("Neg" = "#1f77b4", "Evento" = "#ff7f0e", "Post" = "#2ca02c")) +
# labs(
#   title = "Game Score de Kevin Love - ITC em torno do Evento",
#   subtitle = "Comparação de desempenho antes e depois do evento (±45 jogos)",
#   x = "Distância em jogos do evento (linha 238)",
#   y = "Game Score",
#   color = "Período"
# ) +
# theme_minimal(base_size = 13)

#modelo45 <- lm(game_score ~ distancia * per, data = KevinLove45 %>% filter(per != "Evento"))
#summary(modelo45)

#ggplot(KevinLove82, aes(x = distancia, y = game_score, color = per)) +
# geom_point(size = 2, alpha = 0.7) +
# geom_vline(xintercept = 0, linetype = "dashed", color = "black") + # linha do evento
# geom_hline(aes(yintercept = Med), linetype = "dotted", color = "gray30") + # média geral
# geom_smooth(method = "lm", se = FALSE) + # tendência linear por grupo
# scale_color_manual(values = c("Neg" = "#1f77b4", "Evento" = "#ff7f0e", "Post" = "#2ca02c")) +
# labs(
#   title = "Game Score de Kevin Love - ITC em torno do Evento",
#   subtitle = "Comparação de desempenho antes e depois do evento (±82 jogos)",
#   x = "Distância em jogos do evento (linha 238)",
#   y = "Game Score",
#   color = "Período"
# ) +
# theme_minimal(base_size = 13)

#modelo82 <- lm(game_score ~ distancia * per, data = KevinLove82 %>% filter(per != "Evento"))
#summary(modelo82)

#ggplot(KevinLove164, aes(x = distancia, y = game_score, color = per)) +
# geom_point(size = 2, alpha = 0.7) +
# geom_vline(xintercept = 0, linetype = "dashed", color = "black") + # linha do evento
# geom_hline(aes(yintercept = Med), linetype = "dotted", color = "gray30") + # média geral
# geom_smooth(method = "lm", se = FALSE) + # tendência linear por grupo
# scale_color_manual(values = c("Neg" = "#1f77b4", "Evento" = "#ff7f0e", "Post" = "#2ca02c")) +
# labs(
#   title = "Game Score de Kevin Love - ITC em torno do Evento",
#   subtitle = "Comparação de desempenho antes e depois do evento (±164 jogos)",
#   x = "Distância em jogos do evento (linha 238)",
#   y = "Game Score",
#   color = "Período"
# ) +
# theme_minimal(base_size = 13)

#modelo164 <- lm(game_score ~ distancia * per, data = KevinLove164 %>% filter(per != "Evento"))
#summary(modelo164)


########
#Tentativa de verificar estas informações com análises ligeiramente diferentes
# ao invés de atribuírmos uma janela de tempo de jogos individualmente, vamos
# tentar verificar isso de uma vez só.
#além disso, eu estava pensando, que o tempo de quadra pode ser uma variável de controle
#importante, vamos tentar aqui


#install.packages(("changepoint"))
library(changepoint)
## Warning: package 'changepoint' was built under R version 4.4.3
## Loading required package: zoo
## Warning: package 'zoo' was built under R version 4.4.3
## 
## Attaching package: 'zoo'
## 
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
## 
## Successfully loaded changepoint package version 2.3
##  WARNING: From v.2.3 the default method in cpt.* functions has changed from AMOC to PELT.
##  See NEWS for details of all changes.
# Executa a análise para detectar pontos de mudança na média
# O parâmetro 'method' permite escolher o algoritmo de detecção
analise_cpt <- cpt.mean(KevinLove$game_score, method = "AMOC")
print(analise_cpt)
## Class 'cpt' : Changepoint Object
##        ~~   : S4 class containing 12 slots with names
##               cpttype date version data.set method test.stat pen.type pen.value minseglen cpts ncpts.max param.est 
## 
## Created on  : Thu Aug  7 11:28:30 2025 
## 
## summary(.)  :
## ----------
## Created Using changepoint version 2.3 
## Changepoint type      : Change in mean 
## Method of analysis    : AMOC 
## Test Statistic  : Normal 
## Type of penalty       : MBIC with value, 18.81863 
## Minimum Segment Length : 1 
## Maximum no. of cpts   : 1 
## Changepoint Locations : 493
plot(analise_cpt)

# Adiciona uma linha vertical para marcar o jogo do evento, facilitando a comparação visual.
abline(v = linha_central, col = "blue", lty = 2)

# Extrai o ponto de mudança detectado
pontos_de_mudanca <- cpts(analise_cpt)

# Imprime o resultado para interpretação
cat("\nO ponto de mudança detectado na série é no jogo de índice:", pontos_de_mudanca, "\n")
## 
## O ponto de mudança detectado na série é no jogo de índice: 493
cat("O evento de pânico ocorreu no jogo de índice:", linha_central, "\n")
## O evento de pânico ocorreu no jogo de índice: 238
# Se o 'ponto_de_mudanca_detectado' estiver próximo ou for o mesmo que 'evento_indice',
# isso sugere uma forte correlação temporal.

#você vai perceber pelo gráfico gerado que este ponto de mudança não foi próximo do evento.
#temos que interpretar isso de forma a entender que o evento em sí, considerando a 
#série de jogos do KL não causou nenhuma mudança significativa. Mas temos outras possibilidades.


#COLOCANDO O TEMPO DE QUADRA COMO UMA VARIÁVEL CONTROLE NO MODELO

KevinLove_com_eficiencia <- KevinLove %>%
  mutate(
    game_score_por_minuto = case_when(
      numMinutes > 0 ~ game_score / numMinutes,
      TRUE ~ 0 # Define o valor como 0 quando o tempo de jogo for 0
    )
  )

head(KevinLove_com_eficiencia)
##   firstName lastName personId   gameId            gameDate playerteamCity
## 1     Kevin     Love   201567 21400018 2014-10-30 20:00:00      Cleveland
## 2     Kevin     Love   201567 21400022 2014-10-31 20:00:00      Cleveland
## 3     Kevin     Love   201567 21400055 2014-11-04 22:00:00      Cleveland
## 4     Kevin     Love   201567 21400066 2014-11-05 21:00:00      Cleveland
## 5     Kevin     Love   201567 21400081 2014-11-07 22:30:00      Cleveland
## 6     Kevin     Love   201567 21400098 2014-11-10 19:00:00      Cleveland
##   playerteamName opponentteamCity opponentteamName       gameType gameLabel
## 1      Cavaliers         New York           Knicks Regular Season          
## 2      Cavaliers          Chicago            Bulls Regular Season          
## 3      Cavaliers         Portland    Trail Blazers Regular Season          
## 4      Cavaliers             Utah             Jazz Regular Season          
## 5      Cavaliers           Denver          Nuggets Regular Season          
## 6      Cavaliers      New Orleans         Pelicans Regular Season          
##   gameSubLabel seriesGameNumber win home numMinutes points assists blocks
## 1                            NA   0    1         38     19       4      0
## 2                            NA   1    0         41     16       1      0
## 3                            NA   0    0         35     22       2      0
## 4                            NA   0    0         38     14       1      0
## 5                            NA   1    0         36     19       1      1
## 6                            NA   1    1         38     22       2      0
##   steals fieldGoalsAttempted fieldGoalsMade fieldGoalsPercentage
## 1      0                  14              6                0.429
## 2      4                  17              5                0.294
## 3      0                  14              7                0.500
## 4      1                  10              2                0.200
## 5      0                  16              6                0.375
## 6      1                  13              7                0.538
##   threePointersAttempted threePointersMade threePointersPercentage
## 1                      6                 3                   0.500
## 2                      6                 1                   0.167
## 3                      8                 5                   0.625
## 4                      5                 1                   0.200
## 5                      5                 0                   0.000
## 6                      9                 6                   0.667
##   freeThrowsAttempted freeThrowsMade freeThrowsPercentage reboundsDefensive
## 1                   4              4                1.000                11
## 2                   6              5                0.833                14
## 3                   3              3                1.000                 9
## 4                  11              9                0.818                 8
## 5                   8              7                0.875                 6
## 6                   2              2                1.000                 4
##   reboundsOffensive reboundsTotal foulsPersonal turnovers plusMinusPoints  ano
## 1                 3            14             1         2              -4 2014
## 2                 2            16             2         0               7 2014
## 3                 1            10             4         1              -8 2014
## 4                 0             8             4         1               1 2014
## 5                 2             8             4         2              15 2014
## 6                 1             5             2         1               1 2014
##   mes dia game_score Temporada game_index game_score_por_minuto
## 1  10  30       17.4      2015          1             0.4578947
## 2  10  31       15.2      2015          2             0.3707317
## 3  11  04       17.2      2015          3             0.4914286
## 4  11  05        8.5      2015          4             0.2236842
## 5  11  07       10.8      2015          5             0.3000000
## 6  11  10       18.2      2015          6             0.4789474
#ANÁLISE DESCRITIVA INICIAL PARA VERIFICARMOS INFORMAÇÕE SMAIS BÁSICAS

# Certifique-se de que os pacotes necessários estão carregados
library(knitr)

# Cria a nova variável 'periodo' no dataframe
KevinLove_com_eficiencia <- KevinLove_com_eficiencia %>%
  mutate(
    periodo = ifelse(
      game_index >= evento_indice,
      "Pós-Evento",
      "Pré-Evento"
    )
  )

# Cria uma tabela descritiva comparando os períodos
tabela_descritiva <- KevinLove_com_eficiencia %>%
  mutate(periodo = ifelse(periodo == 1, "Pós-Evento", "Pré-Evento")) %>%
  group_by(periodo) %>%
  summarise(
    Media = mean(game_score_por_minuto, na.rm = TRUE),
    Mediana = median(game_score_por_minuto, na.rm = TRUE),
    `Desvio Padrão` = sd(game_score_por_minuto, na.rm = TRUE),
    N = n()
  )

# Exibe a tabela descritiva formatada
kable(tabela_descritiva, caption = "Estatísticas Descritivas do Game Score por Minuto")
Estatísticas Descritivas do Game Score por Minuto
periodo Media Mediana Desvio Padrão N
Pré-Evento 0.4009387 0.3945588 0.2670596 530
# Cria um boxplot para comparar visualmente os períodos
ggplot(KevinLove_com_eficiencia, aes(x = factor(periodo, levels = c("Pré-Evento", "Pós-Evento")), y = game_score_por_minuto)) +
  geom_boxplot() +
  labs(
    title = "Comparação da Distribuição do Desempenho",
    subtitle = "Período 0: Pré-Evento | Período 1: Pós-Evento",
    x = "Período",
    y = "Game Score por Minuto"
  ) +
  theme_minimal()

evento_indice <- 238

# Aplica a Análise de Pontos de Mudança na série de eficiência
analise_cpt_eficiencia <- cpt.mean(KevinLove_com_eficiencia$game_score_por_minuto, method = "AMOC")

# Visualiza o resultado
plot(analise_cpt_eficiencia)
abline(v = evento_indice, col = "blue", lty = 2)

# Extrai e exibe o(s) ponto(s) de mudança detectado(s)
ponto_de_mudanca_detectado <- cpts(analise_cpt_eficiencia)

cat("\nO ponto de mudança detectado na série de eficiência é no jogo de índice:", ponto_de_mudanca_detectado, "\n")
## 
## O ponto de mudança detectado na série de eficiência é no jogo de índice:
cat("O evento de pânico ocorreu no jogo de índice:", evento_indice, "\n")
## O evento de pânico ocorreu no jogo de índice: 238
# Vamos fazer aqui a Análise de Pontos de Mudança focada na variância
analise_cpt_variancia <- cpt.var(KevinLove_com_eficiencia$game_score_por_minuto, method = "AMOC")

plot(analise_cpt_variancia)
abline(v = evento_indice, col = "blue", lty = 2)

ponto_de_mudanca_variancia <- cpts(analise_cpt_variancia)

cat("\nO ponto de mudança na variância detectado na série de eficiência é no jogo de índice:", ponto_de_mudanca_variancia, "\n")
## 
## O ponto de mudança na variância detectado na série de eficiência é no jogo de índice:
cat("O evento de pânico ocorreu no jogo de índice:", evento_indice, "\n")
## O evento de pânico ocorreu no jogo de índice: 238
#resultado aqui é de que incluindo todos os jogos, não temos uma mudança significativa no pré e pós
#então partimos para a análise iterativa com os números de jogos.

###########
#Análise de Efeitos Defasados (Lagged Effects)
###########

# Define um atraso (lag) de, por exemplo, 5 jogos
lag_jogos <- 5

# Cria uma nova série temporal que começa 5 jogos após o evento
serie_com_lag <- KevinLove_com_eficiencia$game_score_por_minuto[
  (evento_indice + lag_jogos):length(KevinLove_com_eficiencia$game_score_por_minuto)
]

# Realiza a análise de pontos de mudança na série com atraso
analise_lag <- cpt.mean(serie_com_lag, method = "AMOC")

# Visualiza o resultado para a série com lag
plot(analise_lag)

# Extrai e exibe o(s) ponto(s) de mudança detectado(s) na série defasada
ponto_de_mudanca_lag <- cpts(analise_lag)
cat("\nO ponto de mudança na série com lag é:", ponto_de_mudanca_lag, "\n")
## 
## O ponto de mudança na série com lag é:
cat("O evento original ocorreu no jogo de índice:", evento_indice, "\n")
## O evento original ocorreu no jogo de índice: 238
# NOTA: A interpretação é que se um ponto de mudança for encontrado em 'ponto_de_mudanca_lag',
# ele se refere ao índice dentro da nova série 'serie_com_lag'.
# O índice na série original seria (evento_indice + lag_jogos + ponto_de_mudanca_lag - 1).

#vou usar aqui o seu código de 5 jogos com algumas mudanças, principalmente na métrica game_score

KevinLove_com_eficiencia <- KevinLove_com_eficiencia %>%
  mutate(
    linha_atual = row_number(),
    distancia = linha_central - linha_atual,
    modulo = abs(distancia)
  )

KL5 <- KevinLove_com_eficiencia %>%
  filter(modulo <= 5)%>%
  mutate(per = case_when(
    distancia > 0 ~ "Pós",
    distancia < 0 ~ "Pré",
    TRUE ~ "Evento"
  ))%>%
  mutate(Med = mean(game_score_por_minuto))

KL15 <- KevinLove_com_eficiencia %>%
  filter(modulo <= 15)%>%
  mutate(per = case_when(
    distancia > 0 ~ "Pós",
    distancia < 0 ~ "Pré",
    TRUE ~ "Evento"
  ))%>%
  mutate(Med = mean(game_score_por_minuto))

KL45 <- KevinLove_com_eficiencia %>%
  filter(modulo <= 45)%>%
  mutate(per = case_when(
    distancia > 0 ~ "Pós",
    distancia < 0 ~ "Pré",
    TRUE ~ "Evento"
  ))%>%
  mutate(Med = mean(game_score_por_minuto))

KL82 <- KevinLove_com_eficiencia %>%
  filter(modulo <= 82)%>%
  mutate(per = case_when(
    distancia > 0 ~ "Pós",
    distancia < 0 ~ "Pré",
    TRUE ~ "Evento"
  ))%>%
  mutate(Med = mean(game_score_por_minuto))

KL164 <- KevinLove_com_eficiencia %>%
  filter(modulo <= 164)%>%
  mutate(per = case_when(
    distancia > 0 ~ "Pós",
    distancia < 0 ~ "Pré",
    TRUE ~ "Evento"
  ))%>%
  mutate(Med = mean(game_score_por_minuto))

ggplot(KL5, aes(x = distancia, y = game_score_por_minuto, color = per)) +
  geom_point(size = 2, alpha = 0.7) +
  geom_vline(xintercept = 0, linetype = "dashed", color = "black") + # linha do evento
  geom_hline(aes(yintercept = Med), linetype = "dotted", color = "gray30") + # média geral
  geom_smooth(method = "lm", se = FALSE) + # tendência linear por grupo
  scale_color_manual(values = c("Pré" = "#1f77b4", "Evento" = "#ff7f0e", "Pós" = "#2ca02c")) +
  labs(
    title = "Game Score de Kevin Love",
    subtitle = "Comparação de desempenho antes e depois do evento (±5 jogos)",
    x = "Distância em jogos do evento",
    y = "Game Score",
    color = "Período"
  ) +
  theme_minimal(base_size = 13)
## `geom_smooth()` using formula = 'y ~ x'

modelo05 <- lm(game_score_por_minuto ~ distancia * per, data = KL5 %>% filter(per != "Evento"))
summary(modelo05)
## 
## Call:
## lm(formula = game_score_por_minuto ~ distancia * per, data = KL5 %>% 
##     filter(per != "Evento"))
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.36689 -0.24539 -0.01209  0.22364  0.40127 
## 
## Coefficients:
##                  Estimate Std. Error t value Pr(>|t|)
## (Intercept)       0.38055    0.34718   1.096    0.315
## distancia         0.02121    0.10468   0.203    0.846
## perPré            0.54111    0.49098   1.102    0.313
## distancia:perPré  0.09031    0.14804   0.610    0.564
## 
## Residual standard error: 0.331 on 6 degrees of freedom
## Multiple R-squared:  0.2149, Adjusted R-squared:  -0.1777 
## F-statistic: 0.5474 on 3 and 6 DF,  p-value: 0.668
ggplot(KL15, aes(x = distancia, y = game_score_por_minuto, color = per)) +
  geom_point(size = 2, alpha = 0.7) +
  geom_vline(xintercept = 0, linetype = "dashed", color = "black") + # linha do evento
  geom_hline(aes(yintercept = Med), linetype = "dotted", color = "gray30") + # média geral
  geom_smooth(method = "lm", se = FALSE) + # tendência linear por grupo
  scale_color_manual(values = c("Pré" = "#1f77b4", "Evento" = "#ff7f0e", "Pós" = "#2ca02c")) +
  labs(
    title = "Game Score de Kevin Love",
    subtitle = "Comparação de desempenho antes e depois do evento (±15 jogos)",
    x = "Distância em jogos do evento",
    y = "Game Score",
    color = "Período"
  ) +
  theme_minimal(base_size = 13)
## `geom_smooth()` using formula = 'y ~ x'

modelo015 <- lm(game_score_por_minuto ~ distancia * per, data = KL15 %>% filter(per != "Evento"))
summary(modelo015)
## 
## Call:
## lm(formula = game_score_por_minuto ~ distancia * per, data = KL15 %>% 
##     filter(per != "Evento"))
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.47300 -0.20189 -0.04643  0.09193  0.70753 
## 
## Coefficients:
##                    Estimate Std. Error t value Pr(>|t|)  
## (Intercept)       0.4268266  0.1610821   2.650   0.0135 *
## distancia        -0.0002404  0.0177167  -0.014   0.9893  
## perPré            0.1258491  0.2278045   0.552   0.5854  
## distancia:perPré -0.0070133  0.0250552  -0.280   0.7818  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.2965 on 26 degrees of freedom
## Multiple R-squared:  0.107,  Adjusted R-squared:  0.003912 
## F-statistic: 1.038 on 3 and 26 DF,  p-value: 0.3922
ggplot(KL45, aes(x = distancia, y = game_score_por_minuto, color = per)) +
  geom_point(size = 2, alpha = 0.7) +
  geom_vline(xintercept = 0, linetype = "dashed", color = "black") + # linha do evento
  geom_hline(aes(yintercept = Med), linetype = "dotted", color = "gray30") + # média geral
  geom_smooth(method = "lm", se = FALSE) + # tendência linear por grupo
  scale_color_manual(values = c("Pré" = "#1f77b4", "Evento" = "#ff7f0e", "Pós" = "#2ca02c")) +
  labs(
    title = "Game Score de Kevin Love",
    subtitle = "Comparação de desempenho antes e depois do evento (±45 jogos)",
    x = "Distância em jogos do evento",
    y = "Game Score",
    color = "Período"
  ) +
  theme_minimal(base_size = 13)
## `geom_smooth()` using formula = 'y ~ x'

modelo045 <- lm(game_score_por_minuto ~ distancia * per, data = KL45 %>% filter(per != "Evento"))
summary(modelo045)
## 
## Call:
## lm(formula = game_score_por_minuto ~ distancia * per, data = KL45 %>% 
##     filter(per != "Evento"))
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.83867 -0.15408  0.01387  0.15422  0.76343 
## 
## Coefficients:
##                   Estimate Std. Error t value    Pr(>|t|)    
## (Intercept)       0.486477   0.083933   5.796 0.000000109 ***
## distancia        -0.005061   0.003178  -1.593      0.1149    
## perPré            0.183847   0.118700   1.549      0.1251    
## distancia:perPré  0.013585   0.004494   3.023      0.0033 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.2768 on 86 degrees of freedom
## Multiple R-squared:  0.1306, Adjusted R-squared:  0.1003 
## F-statistic: 4.307 on 3 and 86 DF,  p-value: 0.007028
ggplot(KL82, aes(x = distancia, y = game_score_por_minuto, color = per)) +
  geom_point(size = 2, alpha = 0.7) +
  geom_vline(xintercept = 0, linetype = "dashed", color = "black") + # linha do evento
  geom_hline(aes(yintercept = Med), linetype = "dotted", color = "gray30") + # média geral
  geom_smooth(method = "lm", se = FALSE) + # tendência linear por grupo
  scale_color_manual(values = c("Pré" = "#1f77b4", "Evento" = "#ff7f0e", "Pós" = "#2ca02c")) +
  labs(
    title = "Game Score de Kevin Love",
    subtitle = "Comparação de desempenho antes e depois do evento (±82 jogos)",
    x = "Distância em jogos do evento",
    y = "Game Score",
    color = "Período"
  ) +
  theme_minimal(base_size = 13)
## `geom_smooth()` using formula = 'y ~ x'

modelo082 <- lm(game_score_por_minuto ~ distancia * per, data = KL82 %>% filter(per != "Evento"))
summary(modelo082)
## 
## Call:
## lm(formula = game_score_por_minuto ~ distancia * per, data = KL82 %>% 
##     filter(per != "Evento"))
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -0.9224 -0.1721  0.0283  0.1638  0.7918 
## 
## Coefficients:
##                  Estimate Std. Error t value     Pr(>|t|)    
## (Intercept)      0.358183   0.063001   5.685 0.0000000604 ***
## distancia        0.001761   0.001319   1.336      0.18357    
## perPré           0.232364   0.089097   2.608      0.00997 ** 
## distancia:perPré 0.002092   0.001865   1.122      0.26364    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.2826 on 160 degrees of freedom
## Multiple R-squared:  0.0606, Adjusted R-squared:  0.04299 
## F-statistic: 3.441 on 3 and 160 DF,  p-value: 0.01828
ggplot(KL164, aes(x = distancia, y = game_score_por_minuto, color = per)) +
  geom_point(size = 2, alpha = 0.7) +
  geom_vline(xintercept = 0, linetype = "dashed", color = "black") + # linha do evento
  geom_hline(aes(yintercept = Med), linetype = "dotted", color = "gray30") + # média geral
  geom_smooth(method = "lm", se = FALSE) + # tendência linear por grupo
  scale_color_manual(values = c("Pré" = "#1f77b4", "Evento" = "#ff7f0e", "Pós" = "#2ca02c")) +
  labs(
    title = "Game Score de Kevin Love",
    subtitle = "Comparação de desempenho antes e depois do evento (±164 jogos)",
    x = "Distância em jogos do evento",
    y = "Game Score",
    color = "Período"
  ) +
  theme_minimal(base_size = 13)
## `geom_smooth()` using formula = 'y ~ x'

modelo0164 <- lm(game_score_por_minuto ~ distancia * per, data = KL164 %>% filter(per != "Evento"))
summary(modelo0164)
## 
## Call:
## lm(formula = game_score_por_minuto ~ distancia * per, data = KL164 %>% 
##     filter(per != "Evento"))
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.92128 -0.15560  0.01018  0.16075  0.86162 
## 
## Coefficients:
##                     Estimate  Std. Error t value            Pr(>|t|)    
## (Intercept)       0.41339227  0.03945845  10.477 <0.0000000000000002 ***
## distancia        -0.00005439  0.00041484  -0.131               0.896    
## perPré            0.07587605  0.05580267   1.360               0.175    
## distancia:perPré  0.00104445  0.00058667   1.780               0.076 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.2515 on 324 degrees of freedom
## Multiple R-squared:  0.01733,    Adjusted R-squared:  0.008236 
## F-statistic: 1.905 on 3 and 324 DF,  p-value: 0.1286
#ANÁLISE DE AUTOCORRELAÇÃO COM MODELO ARIMA
#a análise anterior interpreta os jogos como sendo indepentendes, o modelo ARIMA
#"testa" os jogos como se tivessem uma dependencia temporal 

# Certifique-se de que os pacotes necessários estão instalados
# e carregue-os no início da sessão.
#install.packages("forecast")
library(forecast)
## Warning: package 'forecast' was built under R version 4.4.3
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
# --------------------------------------------------------------------------
# ETAPA 1: PREPARAÇÃO DOS DADOS
# --------------------------------------------------------------------------

# Identifica o evento de pânico no índice 238
evento_indice <- 238

# Cria a série temporal do Game Score por minuto a partir do seu dataframe
# A função ts() cria um objeto de série temporal no R.
# O parâmetro 'start' é o índice do primeiro jogo (1).
# O parâmetro 'frequency' é 1, pois os dados são diários (jogo a jogo).
serie_game_score <- ts(
  KevinLove_com_eficiencia$game_score_por_minuto,
  start = 1,
  frequency = 1
)

# Cria a variável de intervenção (predictor externo),
# que será 0 antes do evento e 1 a partir do evento.
intervencao_variavel <- ts(
  ifelse(KevinLove_com_eficiencia$game_index >= evento_indice, 1, 0),
  start = 1,
  frequency = 1
)

# --------------------------------------------------------------------------
# ETAPA 2: IDENTIFICAÇÃO E AJUSTE DO MODELO ARIMA
# --------------------------------------------------------------------------

# A função auto.arima() busca e encontra automaticamente a melhor ordem (p, d, q)
# do modelo ARIMA que se ajusta aos seus dados.
# O parâmetro 'xreg' inclui a variável de intervenção no modelo.
modelo_arima_its <- auto.arima(
  serie_game_score,
  xreg = intervencao_variavel
)

# --------------------------------------------------------------------------
# ETAPA 3: ANÁLISE E INTERPRETAÇÃO DOS RESULTADOS
# --------------------------------------------------------------------------

# Exibe o sumário completo do modelo ajustado
summary(modelo_arima_its)
## Series: serie_game_score 
## Regression with ARIMA(1,0,4) errors 
## 
## Coefficients:
##          ar1      ma1     ma2      ma3     ma4  intercept     xreg
##       0.8835  -0.7767  0.0706  -0.1703  0.0983     0.3990  -0.0021
## s.e.  0.0723   0.0832  0.0552   0.0542  0.0433     0.0315   0.0418
## 
## sigma^2 = 0.06781:  log likelihood = -35.46
## AIC=86.93   AICc=87.21   BIC=121.11
## 
## Training set error measures:
##                         ME      RMSE       MAE  MPE MAPE      MASE
## Training set 0.00009177974 0.2586756 0.1985934 -Inf  Inf 0.7427055
##                       ACF1
## Training set 0.00008299536
# Plotar os resíduos para verificar se o modelo se ajustou bem aos dados
# Os resíduos devem se parecer com ruído branco
tsdisplay(residuals(modelo_arima_its))

# O modelo ARIMA fornece um coeficiente para a variável de intervenção.
# A interpretação desse coeficiente é crucial para o seu estudo.
# Um valor positivo indica um aumento no nível de desempenho,
# e um valor negativo indica uma queda, após o evento.
# Um p-valor baixo (geralmente < 0.05) indica que este efeito é estatisticamente significativo.

##############################
#ANÁLISE COM ARIMA USANDO AS JANELAS DE JOGOS
#############################

# Define o índice do evento e a janela de tempo
evento_indice <- 238
janela_jogos <- 45

# --------------------------------------------------------------------------
# ETAPA 1: SUBCOJUNTAR OS DADOS
# --------------------------------------------------------------------------

# Filtra o dataframe para a janela de jogos desejada
# A lógica é pegar os jogos do índice 238 - 45 até 238 + 45.
dados_subconjunto <- KevinLove_com_eficiencia %>%
  filter(
    game_index >= (evento_indice - janela_jogos) &
      game_index <= (evento_indice + janela_jogos)
  )

# Ajusta o índice do evento para o novo subconjunto
evento_indice_subconjunto <- janela_jogos + 1

# --------------------------------------------------------------------------
# ETAPA 2: AJUSTE DO MODELO ARIMA
# --------------------------------------------------------------------------

# Cria a nova série temporal e a nova variável de intervenção a partir do subconjunto
serie_game_score_sub <- ts(
  dados_subconjunto$game_score_por_minuto,
  start = 1,
  frequency = 1
)

intervencao_sub <- ts(
  ifelse(dados_subconjunto$game_index >= evento_indice, 1, 0),
  start = 1,
  frequency = 1
)

# Ajusta o modelo ARIMA com a variável de intervenção
modelo_arima_sub <- auto.arima(
  serie_game_score_sub,
  xreg = intervencao_sub
)

# --------------------------------------------------------------------------
# ETAPA 3: INTERPRETAÇÃO DOS RESULTADOS
# --------------------------------------------------------------------------

summary(modelo_arima_sub)
## Series: serie_game_score_sub 
## Regression with ARIMA(0,0,0) errors 
## 
## Coefficients:
##       intercept    xreg
##          0.3701  0.0996
## s.e.     0.0425  0.0597
## 
## sigma^2 = 0.08294:  log likelihood = -14.83
## AIC=35.66   AICc=35.94   BIC=43.2
## 
## Training set error measures:
##                                     ME      RMSE       MAE  MPE MAPE      MASE
## Training set -0.0000000000000006807682 0.2848067 0.2095938 -Inf  Inf 0.7072283
##                    ACF1
## Training set 0.04270808
# A interpretação será a mesma: procure pelo p-valor do coeficiente 'xreg'.
# Um p-valor baixo (ex: < 0.05) indicaria um efeito significativo nesta janela de tempo.

tsdisplay(residuals(modelo_arima_sub))

# 82 jogos

# Define o índice do evento e a janela de tempo
evento_indice <- 238
janela_jogos <- 82

# --------------------------------------------------------------------------
# ETAPA 1: SUBCOJUNTAR OS DADOS
# --------------------------------------------------------------------------

# Filtra o dataframe para a janela de jogos desejada
dados_subconjunto <- KevinLove_com_eficiencia %>%
  filter(
    game_index >= (evento_indice - janela_jogos) &
      game_index <= (evento_indice + janela_jogos)
  )

# --------------------------------------------------------------------------
# ETAPA 2: AJUSTE DO MODELO ARIMA
# --------------------------------------------------------------------------

# Cria a nova série temporal e a nova variável de intervenção a partir do subconjunto
serie_game_score_sub <- ts(
  dados_subconjunto$game_score_por_minuto,
  start = 1,
  frequency = 1
)

intervencao_sub <- ts(
  ifelse(dados_subconjunto$game_index >= evento_indice, 1, 0),
  start = 1,
  frequency = 1
)

# Ajusta o modelo ARIMA com a variável de intervenção
modelo_arima_sub <- auto.arima(
  serie_game_score_sub,
  xreg = intervencao_sub
)

# --------------------------------------------------------------------------
# ETAPA 3: INTERPRETAÇÃO DOS RESULTADOS
# --------------------------------------------------------------------------

summary(modelo_arima_sub)
## Series: serie_game_score_sub 
## Regression with ARIMA(0,0,0) errors 
## 
## Coefficients:
##       intercept     xreg
##          0.4313  -0.0027
## s.e.     0.0317   0.0448
## 
## sigma^2 = 0.08365:  log likelihood = -28.43
## AIC=62.85   AICc=63   BIC=72.17
## 
## Training set error measures:
##                                  ME      RMSE       MAE  MPE MAPE      MASE
## Training set 0.00000000000005945532 0.2874649 0.2212135 -Inf  Inf 0.7353118
##                   ACF1
## Training set 0.1210739
tsdisplay(residuals(modelo_arima_sub))

# A interpretação do resultado será a seguinte:
# procure o coeficiente 'xreg' e seu erro padrão ('s.e.').
# Se o p-valor for baixo (geralmente < 0.05), a mudança de nível
# no desempenho é estatisticamente significativa para esta janela de tempo.