| Title: | Time Series Collection for trama |
|---|---|
| Description: | Nodes for time series in a trama graph: operators (differencing, lags, transforms, windows, moving averages, aggregation), classical and STL decomposition, ARIMA, ETS and Holt-Winters models with forecasts and benchmarks, stationarity and white-noise tests, and series-specific plots such as correlograms, seasonal and lag plots; multivariate series with VAR and VECM models, Granger causality, Engle-Granger and Johansen cointegration tests, impulse responses and residual diagnostics. Builds on trama.data for tables and on trama.view for plots, without duplicating either. |
| Authors: | Pedro Mambelli Fernandes [aut, cre] (ORCID: <https://orcid.org/0009-0001-1695-279X>), João Paulo Assis Bonifácio [aut] (ORCID: <https://orcid.org/0009-0009-2335-8391>) |
| Maintainer: | Pedro Mambelli Fernandes <[email protected]> |
| License: | MIT + file LICENSE |
| Version: | 0.9.1 |
| Built: | 2026-10-10 23:13:46 UTC |
| Source: | https://github.com/uaipedro/trama |
Sem a série real, só a linha do treino: erro de um passo à frente dentro da amostra, que é otimista por construção. Com a série real (os períodos que o modelo não viu, recortados por 'series/window'), sai a linha do teste, que é a que responde se a previsão presta.
tr_series_accuracy(previsao, real = NULL, reais = NULL)tr_series_accuracy(previsao, real = NULL, reais = NULL)
Série real que não cobre nenhum período da previsão é ERRO, e não linha vazia: é quase sempre o fio ligado na série de treino por engano, e uma tabela só com o treino pareceria resposta.
Correlograma: a autocorrelação em cada defasagem.
tr_series_acf( serie, defasagens = 0L, aspecto = "16:9", tema = "padrão", titulo = "", rotulo_x = "", rotulo_y = "", legenda = "direita" )tr_series_acf( serie, defasagens = 0L, aspecto = "16:9", tema = "padrão", titulo = "", rotulo_x = "", rotulo_y = "", legenda = "direita" )
H0 é a RAIZ UNITÁRIA, e isso inverte a leitura de quem está acostumado a p-valor pequeno ser "achei alguma coisa": aqui rejeitar é concluir ESTACIONÁRIA. O KPSS é o outro lado, com H0 oposta, e é a concordância dos dois que dá chão à conclusão — a ajuda dos dois aponta um para o outro.
tr_series_adf(serie, deterministico = "constante", defasagens = 0L)tr_series_adf(serie, deterministico = "constante", defasagens = 0L)
Não usa 'stats::aggregate()', e a razão foi medida: ele agrupa em blocos a partir da PRIMEIRA observação, e não do calendário. Numa série mensal que começa em março, o "ano" 1 soma de março a fevereiro e é rotulado com o ano de março — anos que não existem, verdes. Aqui o primeiro bloco incompleto é descartado, e o último também: o ano de 1960 com seis meses somaria a metade e pareceria uma queda.
tr_series_aggregate(serie, frequencia = 1L, funcao = "soma")tr_series_aggregate(serie, frequencia = 1L, funcao = "soma")
'automatico = TRUE' ignora as seis ordens, e a ajuda diz isso com todas as letras: esconder os campos dependeria de um param condicional que o card não tem. O resumo do card mostra a ordem que a busca escolheu, então o caminho natural é rodar automático, ler a ordem, e só então fixar à mão.
tr_series_arima( serie, automatico = TRUE, p = 1L, d = 1L, q = 1L, P = 0L, D = 0L, Q = 0L, sazonal = TRUE, constante = TRUE )tr_series_arima( serie, automatico = TRUE, p = 1L, d = 1L, q = 1L, P = 0L, D = 0L, Q = 0L, sazonal = TRUE, constante = TRUE )
Converte o 'models/fit' de 'series/regression', 'series/detrend' ou 'series/deseasonalize' na decomposição aditiva (tendência, sazonal, resto e, se houver, o efeito da covariável) que 'tr_series_component()' e 'tr_series_plot_decomposition()' leem. É o adaptador que o editor põe no fio entre os dois tipos; exportado para o script gerado chamá-lo pelo nome.
tr_series_as_decomposition(x)tr_series_as_decomposition(x)
x |
Ajuste produzido por um dos nós de regressão de série. |
Objeto 'tr_series_decomp'.
Um ARIMA que erra mais que "o mesmo mês do ano passado" não merece o card, e sem o ingênuo sazonal ao lado ninguém fica sabendo. Por isso a referência é um nó de primeira ordem, e não uma coluna escondida no 'accuracy'.
tr_series_baseline(serie, metodo = "ingênuo sazonal", horizonte = 12L)tr_series_baseline(serie, metodo = "ingênuo sazonal", horizonte = 12L)
A mesma hipótese nula do 'series/ljung_box', na fórmula original de 1970 — sem a correção de amostra pequena, que é justamente o que o Ljung-Box acrescentou. Fica na coleção para comparar com trabalho antigo que o reportou; para decidir, o Ljung-Box.
tr_series_box_pierce(serie, defasagens = 0L, graus = 0L)tr_series_box_pierce(serie, defasagens = 0L, graus = 0L)
O alinhamento é pelo TEMPO, e não pela posição: 'a' de 1949 a 1960 menos 'b' de 1955 a 1965 é a diferença de 1955 a 1960 — a interseção. Operar os vetores crus somaria janeiro de 1949 com janeiro de 1955, verde.
tr_series_combine(a, b, operacao = "a - b")tr_series_combine(a, b, operacao = "a - b")
Frequências diferentes são erro, e não conversão implícita: somar uma mensal com uma trimestral pede escolher COMO agregar (soma? média?), e é o 'series/aggregate' que faz essa pergunta.
Divisão por zero sai NA, e não 'Inf'/'NaN': um 'Inf' no meio da série quebra a escala do gráfico e todo nó seguinte, e o aviso do R não chega ao card. O NA chega — o resumo da série conta os faltantes —, e o 'series/interpolate' sabe o que fazer com ele.
'dessazonalizada' é a série sem o sazonal — o que se publica quando se diz "o desemprego subiu em março, descontado o efeito do mês". Na multiplicativa é a divisão, e não a subtração: subtrair um fator de 1,08 de um valor na casa das centenas não tira sazonalidade nenhuma.
tr_series_component(decomposicao, componente = "dessazonalizada")tr_series_component(decomposicao, componente = "dessazonalizada")
'sem_tendencia' é o espelho: a série sem a tendência, com a sazonalidade dentro (sazonal + resto, ou sazonal × resto). É o "estimo a tendência e subtraio" feito às claras, e a mesma regra da divisão vale — na multiplicativa a tendência é o NÍVEL, e a série sem ela é a razão.
Um teste de SINAL: pareia observações distantes no tempo, conta quantas vezes a segunda supera a primeira e pergunta se essa contagem é compatível com cara-ou-coroa. Responde à mesma pergunta do 'series/mann_kendall' por um caminho mais barato — uma contagem de pares em vez de todos os pares da série —, e a dissertação põe os dois lado a lado.
tr_series_cox_stuart( serie, pareamento = "terços", correcao = "nenhuma", .seed = NULL )tr_series_cox_stuart( serie, pareamento = "terços", correcao = "nenhuma", .seed = NULL )
O 'pareamento' existe porque o artigo original e a dissertação DISCORDAM, e as duas leituras se defendem. Em TERÇOS (o original, e o que o 'trend' faz) o miolo da série é descartado: são os extremos que acumularam a tendência, e parear vizinho dilui o contraste. Em METADES (a dissertação, seção 3.3.4) cada observação é pareada com a que está meia série adiante — entram mais pares, cada um com contraste menor. O param não é cosmético: os dois caminhos dão estatísticas diferentes na mesma série, e é por isso que a escolha vai na nota.
A multiplicativa pede série positiva: o sazonal é um fator, e um fator calculado sobre zero ou negativo sai infinito ou com o sinal trocado, sem erro. Recusar é o que manda a pessoa para a aditiva, ou para o log.
tr_series_decompose(serie, tipo = "aditiva")tr_series_decompose(serie, tipo = "aditiva")
Os efeitos de cada período saem de uma regressão em 'periodo' (dummies, contraste à escolha). Com **controlar_tendencia**, a tendência linear entra no MESMO ajuste ('valor ~ t + periodo') e só o sazonal sai da série: numa série com tendência, a média de dezembro fica acima da de janeiro só porque dezembro vem depois, e as dummies sozinhas chamariam isso de sazonalidade.
tr_series_deseasonalize( serie, controlar_tendencia = TRUE, contraste = "soma_zero", excluir = "", remover_ns = FALSE, confianca = 0.95 )tr_series_deseasonalize( serie, controlar_tendencia = TRUE, contraste = "soma_zero", excluir = "", remover_ns = FALSE, confianca = 0.95 )
Ajusta um ARIMA (o do 'modelo' ligado ou um automático), calcula para cada instante e cada tipo a estatística t do efeito, marca os que passam do valor crítico, reajusta e descarta os que deixaram de ser significativos. A conta é a do 'tsoutliers::tso()'; a coleção traduz os tipos e o tempo.
tr_series_detect_interventions( serie, modelo = NULL, pulso = TRUE, degrau = TRUE, temporaria = TRUE, inovacional = FALSE, valor_critico = 0 )tr_series_detect_interventions( serie, modelo = NULL, pulso = TRUE, degrau = TRUE, temporaria = TRUE, inovacional = FALSE, valor_critico = 0 )
É o "estimo num lm e depois subtraio" num nó só. A sazonalidade FICA — quem quer tirá-la junto usa a decomposição —, e a tendência estimada vai pendurada na série como atributo 'tendencia' (um 'ts' no mesmo tempo): é o que permite conferir, no console, que 'saída + tendência' devolve a série.
tr_series_detrend(serie, metodo = "linear", grau = 2L, suavidade = 0.75)tr_series_detrend(serie, metodo = "linear", grau = 2L, suavidade = 0.75)
O polinômio é ortogonal ('poly()'), e não cru como o da 'series/regression': aqui só o AJUSTE importa, não a leitura dos coeficientes, e 't⁵' cru numa série de 144 meses tem número de condição astronômico — o 'lm' perderia dígitos sem avisar.
Faltante não impede o ajuste ('na.exclude'): a tendência é prevista em todo t, e a saída tem NA só onde a série tinha.
'diferenca' é o outro jeito de tirar tendência, e o único sem modelo: a "tendência" é o valor do período anterior, e a série perde a 1ª observação — começa um período depois, com o calendário certo.
'tipo = "sazonal"' usa a frequência como defasagem, e é aqui que a série anual precisa de erro: 'diff(x, lag = 1)' com outro nome não é diferença sazonal, e o card afirmaria uma coisa que a conta não fez.
tr_series_diff(serie, tipo = "simples", ordem = 1L)tr_series_diff(serie, tipo = "simples", ordem = 1L)
Mesmo princípio de 'trama::tr_errors()' e das coleções irmãs, e mesmo teste de duas direções: uma tabela que um teste confere contra o código, pra não envelhecer em silêncio.
tr_series_errors()tr_series_errors()
Série temporal tem um modo de falha próprio, e é por ele que metade destas classes existe: o resultado ERRADO que sai com cara de certo. Uma série com um mês faltando vira uma série com o calendário deslocado dali em diante; uma agregação anual de série que começa em março soma anos que não existem; uma diferença sazonal numa série anual é uma diferença de lag 1 com outro nome. Nenhum desses erra no R — todos saem verdes. Aqui viram card vermelho.
data.frame com 'class' e 'when'.
O modelo é o código de três letras da literatura — erro, tendência, sazonalidade —, e não três enums, porque é assim que ele aparece em todo livro e em todo resumo ("ETS(M,Ad,M)"): quem leu 'MAM' no resumo de um ajuste automático copia o código para fixá-lo.
tr_series_ets(serie, modelo = "ZZZ", amortecida = "auto")tr_series_ets(serie, modelo = "ZZZ", amortecida = "auto")
É a metade que o 'data/example' recusa de propósito: dos conjuntos do R, 31 são 'ts', e lá eles pintariam o card de vermelho no 'store' de 'data/table'. Aqui eles são o assunto.
tr_series_example(dataset = "AirPassengers")tr_series_example(dataset = "AirPassengers")
Série múltipla vira uma opção por coluna ('EuStockMarkets$DAX'): o tipo é univariado, e um param a mais só para escolher a coluna seria um campo que metade das opções ignora.
O irmão do 'series/seasonality_kw' que faz a pergunta ao contrário. O Kruskal-Wallis compara estações que VOCÊ já declarou — ele precisa da frequência da série para saber o que é janeiro. Este aqui não declara nada: ele varre o periodograma inteiro e pergunta se o MAIOR pico é maior do que o acaso produziria. Quem sabe qual é o ciclo usa o Kruskal-Wallis; quem está caçando um ciclo desconhecido usa este.
tr_series_fisher(serie, remover = "reta")tr_series_fisher(serie, remover = "reta")
E é dessa varredura que vem a única armadilha da página: o teste acha o maior pico ONDE QUER QUE ELE ESTEJA, e nem todo pico é estação. No 'Nile' — uma série anual sem sazonalidade nenhuma — ele rejeita, e o pico está no período 100, que é a série inteira. Isso não é um ciclo: é a tendência que sobrou. Por isso o bloco publica o PERÍODO junto com o veredito, e avisa na 'nota' quando o pico não chega a se repetir dentro da série.
A frequência é declarada AQUI, uma vez, e viaja com a série — é o motivo de o tipo 'series/ts' existir.
tr_series_from_table( dados, valor = "", tempo = "", frequencia = 12L, inicio = "" )tr_series_from_table( dados, valor = "", tempo = "", frequencia = 12L, inicio = "" )
Com uma coluna de tempo, o nó ORDENA por ela e confere a grade. As duas recusas (tempo repetido, período faltando) são o coração do nó: um 'ts' é só um vetor com início e frequência, e não sabe que a linha de maio sumiu. Sem a checagem, junho passaria a ser chamado de maio e todo o calendário dali em diante sairia deslocado de um mês — a sazonalidade estimada, a previsão e o gráfico sazonal errados, e o card verde.
A grade só é conferida onde há calendário a conferir: data com frequência 12, 4 ou 1, e ano inteiro com frequência 1. Para o resto (diária com ciclo semanal, por exemplo) a coluna só ordena, e a ajuda diz isso.
'inicio' e uma coluna de datas ao mesmo tempo é recusado, e não resolvido por precedência: seriam duas fontes para o mesmo fato, e a que perdesse discordaria da tela sem aviso.
Reaproveita o 'series/from_table' coluna a coluna, para que as regras de calendário (tempo repetido, buraco, início) sejam as mesmas, ditas com as mesmas mensagens.
tr_series_from_table_mts( dados, valores = character(), tempo = "", frequencia = 12L, inicio = "" )tr_series_from_table_mts( dados, valores = character(), tempo = "", frequencia = 12L, inicio = "" )
Fica ao lado do ETS, que o generaliza, porque é o método que se ensina e o que se cita: tirar a tendência ou a sazonalidade é desligar uma chave, e o efeito na previsão aparece no card seguinte.
tr_series_holt_winters( serie, tendencia = TRUE, sazonalidade = TRUE, tipo = "aditiva" )tr_series_holt_winters( serie, tendencia = TRUE, sazonalidade = TRUE, tipo = "aditiva" )
Existe ao lado do 'data/replace_na' porque faz outra coisa: não põe uma constante, estima o valor pelo vizinho no tempo e, em série sazonal, pela mesma estação dos outros anos ('forecast::na.interp'). Preencher o julho faltante com zero derruba a sazonalidade inteira; com a interpolação, o julho sai com cara de julho.
tr_series_interpolate(serie)tr_series_interpolate(serie)
Devolve a mesma série, com a intervenção somada às que já vinham declaradas. 'pulso' é o outlier aditivo (AO), 'degrau' a mudança de nível (LS), 'rampa' a mudança de inclinação e 'inovacional' o choque que passa pela dinâmica do modelo (IO). Com 'dinamica = "gradual"' (pulso e degrau), o efeito entra por ω/(1 − δB), de Box & Tiao (1975).
tr_series_intervencao(serie, data, tipo = "degrau", dinamica = "imediata")tr_series_intervencao(serie, data, tipo = "degrau", dinamica = "imediata")
Os fios variádicos não trazem nome: o nome vem de 'nomes' (separados por vírgula, na ordem dos fios) ou, sem ele, do atributo 'nome' que a série carrega desde a origem ('series/example' com 'EuStockMarkets$DAX', 'series/from_table') — e, faltando os dois, 'serie_1', 'serie_2'...
tr_series_join(series, nomes = "")tr_series_join(series, nomes = "")
Frequências diferentes são recusadas: alinhar mensal com trimestral pede agregação, e é o 'series/aggregate' que a faz, explicitamente. Janelas diferentes, não: o recorte é a interseção, e a nota diz quanto se perdeu.
O outro lado do ADF: aqui H0 é a ESTACIONARIEDADE, e a rejeição vem da cauda de CIMA ('sentido = "maior"'). É o único teste da coleção assim, e é por causa dele que o campo existe — sem ele a regra de decisão viveria num 'if' por nome de teste.
tr_series_kpss(serie, deterministico = "constante")tr_series_kpss(serie, deterministico = "constante")
O não paramétrico da sazonalidade, e o primeiro bloco da categoria: põe TODAS as observações em postos e pergunta se a soma dos postos muda de uma estação para outra. Janeiro sempre alto e julho sempre baixo afastam as somas, e o H cresce. O F da sazonalidade ('series/regression' → 'models/anova_table') responde à mesma pergunta pedindo erro normal em troca.
tr_series_kruskal_wallis(serie)tr_series_kruskal_wallis(serie)
A sazonalidade que ele enxerga é DETERMINÍSTICA: o padrão que se repete igual todo ciclo. A ESTOCÁSTICA, a que vai mudando de ano para ano, não tem um "nível de janeiro" fixo para o posto encontrar e passa por aqui sem ser vista — a dissertação separa as duas na seção 3.4.
E o que mais engana: TENDÊNCIA ATRAPALHA. Numa série que cresce, os postos altos são todos dos anos finais e se espalham por todas as estações, que é por que o 'AirPassengers' — a série sazonal de livro — não rejeita aqui. Tirar a tendência antes ('series/diff') resolve; passar um log NÃO, porque o log é monotônico e não troca a ordem de valor nenhum, então não mexe em posto nenhum. O detalhe está na página do nó, com os números medidos.
Os valores não mudam, só o tempo — que é exatamente o que o 'ts' guarda. Isso importa para quem vai juntar a série defasada com a original numa tabela ('data/join' por 'tempo'): é o join que alinha 'x_t' com 'x_t-k'. 'k' negativo adianta.
tr_series_lag(serie, k = 1L)tr_series_lag(serie, k = 1L)
É o correlograma sem o resumo: cada painel mostra a nuvem cuja correlação é uma barra do ACF, e aí se vê o que o número esconde — relação curva, um ponto sozinho puxando tudo, dois regimes. Numa série sazonal os pontos saem coloridos pela estação, e o painel do ciclo (12 na mensal) é o que fica colado na diagonal.
tr_series_lag_plot( serie, defasagens = 0L, aspecto = "16:9", tema = "padrão", titulo = "", rotulo_x = "", rotulo_y = "", legenda = "direita" )tr_series_lag_plot( serie, defasagens = 0L, aspecto = "16:9", tema = "padrão", titulo = "", rotulo_x = "", rotulo_y = "", legenda = "direita" )
O corrigido para amostra pequena, e por isso o que se reporta — o 'series/box_pierce' testa a mesma hipótese nula pela fórmula original.
tr_series_ljung_box(serie, defasagens = 0L, graus = 0L)tr_series_ljung_box(serie, defasagens = 0L, graus = 0L)
O uso típico é nos RESÍDUOS de um modelo, e aí 'graus' importa: os parâmetros ajustados (p + q + P + Q de um ARIMA) consomem graus de liberdade, e sem descontá-los o teste fica generoso demais — aceita ruído branco onde há estrutura.
O teste de tendência mais usado em climatologia, e não paramétrico: conta, par a par, quantas vezes o futuro supera o passado. Não supõe distribuição nenhuma, que é por que ele é o padrão justamente onde a série não é normal — o F da tendência ('series/regression' → 'models/anova_table') mede a mesma coisa pedindo erro normal em troca.
tr_series_mann_kendall(serie, correcao = "nenhuma", .seed = NULL)tr_series_mann_kendall(serie, correcao = "nenhuma", .seed = NULL)
A tendência que ele enxerga é MONOTÔNICA: numa série que sobe e depois desce, os pares de um lado cancelam os do outro e o teste pode sair sem tendência nenhuma. A direção, quando rejeita, está no SINAL de Z, e é ela que vai para a conclusão — um bilateral que só dissesse "há tendência" jogaria fora o que o usuário foi perguntar.
Centrada com ordem par é a média 2×k (a de ordem 12 numa série mensal é a que remove a sazonalidade inteira), que é o que 'forecast::ma()' faz e o que a decomposição clássica usa por dentro. As bordas saem NA — metade da janela para cada lado —, e não encurtadas: é o honesto, e o gráfico mostra.
tr_series_moving_average(serie, ordem = 12L, centrada = TRUE)tr_series_moving_average(serie, ordem = 12L, centrada = TRUE)
É a pergunta que se faz ANTES de montar o 'series/diff' ou de fixar o 'd' e o 'D' de um ARIMA à mão. As diferenças sazonais vêm do teste de força sazonal do 'forecast', e só existem para série com ciclo — na anual a linha sai NA com o motivo, e não zero, que afirmaria "testei e não precisa".
tr_series_ndiffs(serie, teste = "kpss")tr_series_ndiffs(serie, teste = "kpss")
Autocorrelação parcial: a correlação com a defasagem k, descontadas as intermediárias.
tr_series_pacf( serie, defasagens = 0L, aspecto = "16:9", tema = "padrão", titulo = "", rotulo_x = "", rotulo_y = "", legenda = "direita" )tr_series_pacf( serie, defasagens = 0L, aspecto = "16:9", tema = "padrão", titulo = "", rotulo_x = "", rotulo_y = "", legenda = "direita" )
O único dos quatro não paramétricos desta categoria que NÃO pergunta por tendência. A hipótese nula é HOMOGENEIDADE: que 'Z_1..Z_t' e 'Z_t+1..Z_N' venham da mesma população. Rejeitar localiza uma RUPTURA — a dissertação é enfática nisso, citando Niel et al. (1998) —, e não autoriza dizer que a série sobe ou desce. Os três irmãos de categoria testam tendência, então a conclusão daqui é o lugar mais fácil da coleção para um copiar-colar mentir: ela nomeia QUANDO a série mudou e cala sobre direção, de propósito.
tr_series_pettitt(serie, correcao = "nenhuma", .seed = NULL)tr_series_pettitt(serie, correcao = "nenhuma", .seed = NULL)
Mesma H0 do ADF — raiz unitária —, e mesma leitura invertida: rejeitar é concluir estacionária. Difere no meio do caminho: em vez de acrescentar defasagens à regressão, corrige a estatística para a autocorrelação dos resíduos.
tr_series_phillips_perron(serie, deterministico = "tendência")tr_series_phillips_perron(serie, deterministico = "tendência")
Uma coluna da série múltipla, de volta ao mundo univariado.
tr_series_pick(series, variavel = "")tr_series_pick(series, variavel = "")
'sobreposta' é para VER uma série estimada sobre a original antes de usá-la — a tendência que se vai subtrair, a média móvel, a previsão de outro modelo. Mesmo eixo Y, e não dois painéis: a pergunta é se a tendência acompanha a série, e isso só se lê com as duas uma sobre a outra.
tr_series_plot( serie, pontos = FALSE, sobreposta = NULL, nome_serie = "", nome_sobreposta = "", aspecto = "16:9", tema = "padrão", titulo = "", rotulo_x = "", rotulo_y = "", legenda = "direita" )tr_series_plot( serie, pontos = FALSE, sobreposta = NULL, nome_serie = "", nome_sobreposta = "", aspecto = "16:9", tema = "padrão", titulo = "", rotulo_x = "", rotulo_y = "", legenda = "direita" )
Frequências diferentes são recusadas, como no 'series/combine': uma mensal e uma anual no mesmo eixo parecem comparáveis ponto a ponto, e não são. Janelas diferentes, não: o eixo é a união, e cada linha ocupa o seu trecho.
'sobreposta' vem DEPOIS de 'pontos' para não mudar a posição dos argumentos de quem já chamava 'tr_series_plot(x, TRUE)' no console.
Escala livre por painel, e é o que se tem de ler com cuidado: o sazonal com amplitude de ±40 e o resto de ±10 saem com a MESMA altura. A escala de cada painel está no eixo, e é ela que diz o tamanho do componente.
tr_series_plot_decomposition( decomposicao, aspecto = "4:3", tema = "padrão", titulo = "", rotulo_x = "", rotulo_y = "", legenda = "direita" )tr_series_plot_decomposition( decomposicao, aspecto = "4:3", tema = "padrão", titulo = "", rotulo_x = "", rotulo_y = "", legenda = "direita" )
Uma faixa por série, eixo y livre: níveis diferentes não se espremem.
tr_series_plot_mts( serie, aspecto = "16:9", tema = "padrão", titulo = "", rotulo_x = "", rotulo_y = "", legenda = "direita" )tr_series_plot_mts( serie, aspecto = "16:9", tema = "padrão", titulo = "", rotulo_x = "", rotulo_y = "", legenda = "direita" )
Agrupa observações consecutivas, calcula média e amplitude de cada bloco e testa a inclinação da regressão amplitude ~ média.
tr_series_range_mean( serie, tamanho = stats::frequency(serie), aspecto = "4:3", tema = "claro", titulo = "", rotulo_x = "Média do bloco", rotulo_y = "Amplitude do bloco", legenda = "direita" )tr_series_range_mean( serie, tamanho = stats::frequency(serie), aspecto = "4:3", tema = "claro", titulo = "", rotulo_x = "Média do bloco", rotulo_y = "Amplitude do bloco", legenda = "direita" )
O que a clássica e a STL não dão: coeficiente, erro-padrão e p-valor. A fórmula é escrita sobre nomes que o bloco constrói a partir da série — 'valor' (a série), 't' (1, 2, ..., n), 'periodo' (fator do ciclo: jan, ..., dez), 'ano' (o ano civil de cada observação) e 'regressor' (a série ligada na entrada de mesmo nome) —, e é por serem construídos AQUI que a previsão sabe estendê-los: o futuro de 't', 'periodo' e 'ano' é conhecido; o do 'regressor', não, e vem pela entrada 'futuro' do 'series/forecast'.
tr_series_regression( serie, formula = "valor ~ t + periodo", contraste = "soma_zero", regressor = NULL, erro = "independente", ar = 1L, ma = 0L, excluir = "", remover_ns = FALSE, confianca = 0.95 )tr_series_regression( serie, formula = "valor ~ t + periodo", contraste = "soma_zero", regressor = NULL, erro = "independente", ar = 1L, ma = 0L, excluir = "", remover_ns = FALSE, confianca = 0.95 )
O ajuste sai como 'models/fit' (contrato da 'trama.models'): coeficientes, quadro da ANOVA, estatísticas e diagnóstico são os blocos de lá. Os componentes — tendência, sazonal, efeito do regressor e resto — viajam no mesmo objeto, e o 'series/component' os lê pelo adaptador 'models/fit -> series/decomposition'.
O 'contraste' muda como os coeficientes de 'periodo' são LIDOS, e não a decomposição. Com 'soma_zero', cada coeficiente sazonal é o desvio do período em relação à média; com 'categoria_base', é a diferença para o primeiro período (o 'summary()' do R). Em ambos o componente sazonal devolvido é centrado em zero e a tendência absorve a média.
Série, e não tabela, porque o destino natural é 'series/ljung_box' e 'series/acf': o diagnóstico de um modelo é perguntar se o que sobrou ainda tem estrutura temporal.
tr_series_residuals(modelo)tr_series_residuals(modelo)
Conta SEQUÊNCIAS (runs): trechos seguidos de valores do mesmo lado da mediana. Poucas sequências é sinal de que os valores se agrupam; muitas, de que alternam. H0 aqui é ALEATORIEDADE, e não ausência de tendência — o que separa este bloco dos dois irmãos de categoria, que perguntam por tendência direto. Rejeitar diz que a série não foi gerada ao acaso; tendência é UMA das causas possíveis, ao lado de mudança de nível, ciclo e agrupamento, e é por isso que a conclusão não fala em tendência.
tr_series_runs(serie)tr_series_runs(serie)
Responde duas perguntas de uma vez: qual é o FORMATO da sazonalidade (o pico é em julho?) e se ele MUDA com o tempo (os anos recentes, de cor mais clara, repetem a forma dos antigos?). A cor é contínua pelo ano para que a mudança se leia como degradê — na escala contínua do TEMA, que o gráfico não fixa: trocar 'continua' no tema do projeto troca este degradê também.
tr_series_seasonal_plot( serie, aspecto = "16:9", tema = "padrão", titulo = "", rotulo_x = "", rotulo_y = "", legenda = "direita" )tr_series_seasonal_plot( serie, aspecto = "16:9", tema = "padrão", titulo = "", rotulo_x = "", rotulo_y = "", legenda = "direita" )
'janela_sazonal = 0' é "periódica": o mesmo padrão sazonal em todos os anos, o que aproxima a clássica. Um número (ímpar, >= 7) é quantos anos entram na suavização de cada estação — menor deixa a sazonalidade mudar mais depressa. O zero como "periódica" evita um param de texto que aceitasse "periodic" e mais nada.
tr_series_stl(serie, janela_sazonal = 0L, robusta = FALSE)tr_series_stl(serie, janela_sazonal = 0L, robusta = FALSE)
'robusta' troca a média pela suavização com pesos que ignoram outlier: um mês de greve deixa de puxar a sazonalidade de todos os outros anos — e vai parar no resto, que é onde ele deve aparecer.
O complemento do gráfico sazonal: aquele mostra o formato do ciclo, este mostra como CADA estação evoluiu. Um julho que sobe mais que os outros meses — sazonalidade que muda — é invisível no sazonal e óbvio aqui.
tr_series_subseries( serie, aspecto = "16:9", tema = "padrão", titulo = "", rotulo_x = "", rotulo_y = "", legenda = "direita" )tr_series_subseries( serie, aspecto = "16:9", tema = "padrão", titulo = "", rotulo_x = "", rotulo_y = "", legenda = "direita" )
Até frequência 24: com 52 painéis semanais o gráfico vira uma parede.
Log de zero é '-Inf', e de negativo é 'NaN' com um aviso que não chega ao card: a série sairia com buracos que parecem faltantes. Recusar com a contagem é o que manda a pessoa somar uma constante antes (na 'data'), com a escolha de quanto somar feita às claras.
tr_series_transform(serie, metodo = "log", lambda = "")tr_series_transform(serie, metodo = "log", lambda = "")
'lambda' em branco é Box-Cox AUTOMÁTICO (Guerrero), e o λ escolhido fica pendurado na série como atributo — é o que o 'forecast' usa, e o que o resumo mostraria se alguém perguntar "qual λ ele escolheu?".
'defasagens = 0' escolhe p pelo critério em 'criterio' (até 'max_defasagens'), a mesma conta do 'series/var_select'; com p fixo, 'criterio' é ignorado. Sazonais (dummies centradas do 'vars') só em série com ciclo.
tr_series_var( series, defasagens = 0L, max_defasagens = 8L, criterio = "AIC", deterministico = "constante", sazonal = FALSE )tr_series_var( series, defasagens = 0L, max_defasagens = 8L, criterio = "AIC", deterministico = "constante", sazonal = FALSE )
'fim' só com o ano quer dizer o ÚLTIMO período daquele ano. Sem isto, 'fim = "1956"' numa série mensal pararia em janeiro de 1956 — que é o que o 'window()' do R entende, e não o que ninguém quis dizer.
tr_series_window(serie, inicio = "", fim = "")tr_series_window(serie, inicio = "", fim = "")
Período fora da série é erro, não recorte silencioso até a borda: um 'inicio = "1995"' digitado no lugar de '"1959"' devolveria a série inteira e o card verde.
Mesma H0 do 'series/adf' — raiz unitária — e mesma leitura invertida: rejeitar é concluir estacionária. O que o justifica é o VIÉS dos outros dois: ADF e Phillips-Perron tendem a NÃO rejeitar quando a série tem quebra estrutural (MARGARIDO, 2001, citado na dissertação), porque uma série estacionária em torno de uma média deslocada se parece com passeio aleatório para os dois. Aqui a data da quebra é ESTIMADA, não informada: o teste varre os cortes entre 15 estacionariedade. A janela é a do teste publicado, e não a do 'urca', que varre todos os cortes.
tr_series_zivot_andrews( serie, mudanca = "ambas", defasagens = -1L, selecao = "fixa" )tr_series_zivot_andrews( serie, mudanca = "ambas", defasagens = -1L, selecao = "fixa" )
É o segundo bloco da coleção a publicar um ponto localizado na série, depois do 'series/pettitt', e usa o mesmo '.tr_series_rotulo_em()' para o rótulo.
Carrega DEPOIS de 'trama.data' e 'trama.view': as portas usam 'data/table' e 'view/plot', e o registro recusa porta com tipo desconhecido. É a mesma dependência de ordem que a 'view' tem com a 'data', travada por teste em 'test-catalogo.R'.
trama_collection()trama_collection()
Os ids de categoria têm prefixo ('serie_*') porque o registro de categorias é GLOBAL ('registry$categories[[id]]'): uma categoria 'fonte' aqui sobrescreveria em silêncio a de outra coleção que usasse o mesmo id.