Módulo 4 - Transformações e suavizações
Ao analisar séries temporais, nem sempre os padrões que queremos investigar ficam claros à primeira vista. Isso ocorre, muitas vezes, porque a série contém ruído – flutuações aleatórias que podem dificultar a identificação de tendências ou padrões sazonais. Um exemplo comum é quando os dados diários possuem muita variação, tornando difícil distinguir uma verdadeira mudança de tendência de uma simples variação aleatória.
Um exemplo frequente disso foi durante a pandemia de covid-19, quando a imprensa e as agências de saúde utilizaram a técnica da média móvel para suavizar os valores diários de casos confirmados e mortes. Essa suavização ajudou a acompanhar a evolução da pandemia de forma mais clara, destacando a tendência geral dos casos e permitindo uma visualização mais estável dos dados.
No gráfico acima, os dados diários (em cinza) mostram muitas flutuações, o que dificulta perceber imediatamente uma tendência clara. Quando olhamos apenas para um dia específico, como um valor baixo, não podemos saber se isso indica realmente uma queda nos casos ou apenas uma flutuação aleatória. Ao utilizar a média móvel (linha vermelha), conseguimos visualizar essas variações e obter uma visão mais clara da tendência geral, facilitando a interpretação dos dados.
Nas próximas seções, vamos explorar técnicas de transformações e suavizações que podem ser aplicadas para lidar com ruídos e variações indesejadas, permitindo uma análise mais precisa e confiável das séries temporais.
Funções
A aplicação de certas funções, como a função logarítmica e a transformação de Box-Cox são úteis para estabilização da variância dos dados. Por exemplo, se os casos de uma doença crescem exponencialmente, a transformação logarítmica pode “linearizar” esse crescimento, facilitando a análise. Poderemos usar isso nas técnicas de modelagem de séries temporais, mas veremos só mais à frente. Não se preocupe.
Na Figura 22A vemos uma série cuja variância não é constante, ou seja, a amplitude dos valores ao redor da tendência (média) varia ao longo do tempo. Já na Figura 22B vemos a série após a aplicação da transformação logarítmica.
Figura 22: Exemplo de transformações de séries temporais.

Atenção
Observação: Por padrão, quando utilizamos a função
log()
no software R
e, por consequência,
aplicamos a transformação logarítmica, estamos nos referindo ao log na
base natural ().
Em outras notações pode ser conhecido como “log natural”, ou .
Box-Cox
Box e Cox (1964) propuseram uma transformação mais versátil, chamada transformação de Box-Cox. Essa depende de um parâmetro lambda (), que define como será a transformação. Caso seja zero, a transformação logarítmica que já conhecemos é aplicada. Caso contrário, aplica-se a transformação exponencial da série à potência , ou seja:
A transformação de Box-Cox também é útil para estabilização da variância e pode funcionar melhor em mais situações, além de aproximar a distribuição dos dados à distribuição normal para melhorar o ajuste de modelos de séries temporais, como o modelo ARIMA.
Podemos testar, portanto, vários valores de . Acompanhe na Figura 23 um exemplo de uso de vários diferentes:
Figura 23: Exemplo de uso de para transformar séries temporais.
É possível trabalhar com um valor de escolhido automaticamente, que nesse caso foi o de -0.4. O método automático foi proposto por Guerrero (1993) e busca a escolha de um valor de que minimiza o coeficiente de variação para a série.
Diferenciação
Uma vez que verificamos que a série é não estacionária (ou seja, possui tendência), podemos trabalhar para remover essa tendência da visualização. Novamente, essa operação pode ser necessária para aplicação de modelos que pressupõem estacionariedade da série, como veremos mais a frente. Uma das formas de atingir esse objetivo é por meio da diferenciação.
O processo de diferenciação de primeira ordem é simples e se dá, para cada valor da série, pela subtração do valor anterior. Ou seja, em uma série , o valor em cada momento da série se dá por:
Onde:
- representa os valores da série já diferenciada.
Vamos aplicar a diferenciação sobre a mesma série usada anteriormente.
Figura 24: Exemplo de uso de diferenciação em séries temporais.
Vemos que agora a tendência foi removida, e temos uma série centrada no valor zero. Podemos combinar as duas transformações vistas para obter uma série estacionária e com variância estabilizada:
Figura 25: Exemplo de série temporal após remoção da tendência e estabilização da variância.
Médias móveis
Assim como vimos no exemplo da covid-19, a média móvel é uma técnica para suavizar a série temporal, destacando sua tendência e tirando a influência do ruído aleatório. A técnica, como o nome diz, consiste em uma média aritmética das observações. Neste caso, são várias médias: para cada ponto na série, calcula-se a média dele mesmo com as observações mais próximas. Esse valor de define a ordem da média móvel. Por exemplo, uma média móvel de ordem 3 se refere a média do próprio ponto e seus dois pontos próximos, podendo ser à esquerda, à direita ou em ambas direções.
Figura 26: Média móvel de ordem h=5, alinhada à esquerda, à direita e centrada.
Dessa forma, temos que:
Para representar uma média móvel à direita (onde olhamos para os valores passados, como era o exemplo da covid-19), vamos aplicar uma média móvel centrada com e para a série semanal de dengue no Maranhão nos anos de 2023 e 2024 (Figura 27).
Figura 27: Casos prováveis de dengue, São Luís-MA, 2023 e 2024.
Ao analisarmos a Figura 27 podemos perceber que, à medida que aumentamos o valor de , a série temporal se torna mais suavizada. No entanto, também observamos que as séries suavizadas acabam perdendo parte de sua extensão. Mas por que isso acontece?
A razão para essa perda está na forma como a média móvel é calculada. Para cada ponto da série, a média é calculada com base em valores próximos. Por exemplo, se = 5, podemos usar os 2 valores anteriores e os 2 valores seguintes, ou algum outro arranjo próximo, dependendo da posição. Porém, em alguns pontos da série, especialmente no início e no final, não existem vizinhos suficientes para calcular a média. Isso resulta em uma perda de valores nas extremidades da série.
Veja, por exemplo, o que acontece ao calcular a média móvel de ordem 5:
Figura 28: Série original (primeiros valores).
Figura 29: Série suavizada com média móvel de ordem 5 (primeiros valores).
Nesse caso, podemos ver que os primeiros valores da série original não podem ser suavizados, pois não há vizinhos suficientes para calcular a média. Isso também ocorrerá com os últimos valores da série.
Kernel
Outra possível técnica de suavização de uma série temporal é a suavização por Kernel. Essa técnica está inclusa em métodos mais avançados que ajustam curvas suaves aos dados, levando em conta as vizinhanças locais. Essas técnicas são mais flexíveis e são particularmente úteis quando a série tem padrões complexos.
Um Kernel é uma função ponderada que é aplicada sobre cada ponto de uma série temporal e seus vizinhos. Essa função atribui mais peso ao ponto de interesse e menores pesos aos pontos mais distantes, suavizando a série. O formato da função de suavização (Kernel) e o tamanho da janela utilizada, chamado de largura de banda, determinam o tipo e a intensidade da suavização. Diferentes tipos de Kernel podem ser usados, como o Gaussiano, Retangular, Triangular, Cosseno, ou Epanechnikov, cada um proporcionando uma forma diferente de suavização.
A escolha da função Kernel e da largura de banda tem impacto direto na forma como a suavização ocorre. Repare na Figura 30 como o comportamento de suavização pode variar conforme a função escolhida:
Figura 30: Casos prováveis de dengue, São Luís-MA, 2023 e 2024.
O parâmetro de largura de banda (Bandwidth - BW) é o que define a quantidade de suavização aplicada ao kernel. Vamos visualizar, na Figura 31, a aplicação de variações desse parâmetro à série de casos prováveis de dengue no Maranhão:
Figura 31: Variações da largura de banda: Casos prováveis de dengue, São Luís-MA, 2023 e 2024.
Percebe-se que uma largura de banda maior implica numa maior suavização. A curva verde, com BW = 20, se aproxima das variações de médio termo da série, enquanto as suavizações de BW = 50 ou BW = 100 reproduzem uma tendência de mais longo termo.
Loess
Loess (Locally Estimated Scatterplot Smoothing) e Lowess (Locally Weighted Scatterplot Smoothing) são métodos de suavização semelhantes ao Kernel, mas, em vez de usar médias ponderadas, esses métodos fazem regressões locais para estimar os valores suavizados.
No caso do Loess, para cada ponto da série, um polinômio é ajustado a um subconjunto de dados utilizando o método dos mínimos quadrados, resultando em uma curva suave. Já no Lowess, uma reta é ajustada, mas utilizando mínimos quadrados ponderados, dando mais peso aos pontos mais próximos e menos peso aos mais distantes.
O subconjunto de dados usado em cada estimativa é chamado de janela ou largura de banda (também conhecido como parâmetro de suavização). Esse parâmetro controla a flexibilidade da função de regressão. Se a janela for muito ampla (muitos dados considerados se igualando ao total de pontos, por exemplo), o alisamento será maior; se a janela for menor, a suavização será mais limitada. Quanto maior a janela, maior o alisamento da série.
A largura da janela é expressa como uma fração dos dados, variando de 0 a 1. Por exemplo, uma janela de 0,1 indica que 10% dos dados no eixo horizontal estão sendo usados para estimar o valor suavizado em cada ponto.
Outro aspecto importante é o grau do polinômio utilizado nas regressões locais:
- Polinômio de grau 0: é equivalente a uma média móvel simples.
- Polinômio de grau 1: resulta em uma regressão linear local.
- Polinômio de grau 2: resulta em uma regressão quadrática local.
Se a janela incluir 100% dos pontos, o resultado será equivalente a calcular a média simples de toda a série.
Vantagens:
- Simples e eficaz: Loess e Lowess são ótimos para análise exploratória, fornecendo uma curva suave e flexível.
- Menos sensível às bordas: Essas técnicas lidam bem com pontos próximos às extremidades da série, onde pode ser mais impreciso.
Desvantagens: - Sensibilidade a valores extremos: O método pode ser influenciado por outliers, o que pode distorcer a suavização.
Splines
Os Splines são um conjunto de funções polinomiais que têm diversos usos na análise de dados. No nosso caso, os splines são utilizados como uma técnica de suavização, permitindo que diferentes segmentos da série temporal sejam ajustados de forma suave e contínua. Eles são particularmente úteis porque permitem unir diferentes pontos, chamados de nós, de forma suave, mantendo propriedades matemáticas ideais.
A mais usada para suavização é a spline cúbica natural. Trata-se de uma forma de regressão penalizada, em que os nós estão posicionados em diferentes valores de . A suavização entre esses nós ocorre por meio de funções polinomiais cúbicas, que garantem uma transição suave entre os segmentos da série.
A escolha do parâmetro de suavização (ou seja, quão “suave” a curva deve ser) pode ser feita de maneira visual, observando o gráfico, ou de forma mais formal, utilizando métodos que minimizam o erro quadrático médio ou através de técnicas de validação cruzada.
Na regressão penalizada, o objetivo é encontrar a função que minimize o seguinte:
Sendo o parâmetro de alisamento:
Se é interpolação pontual (conecta os pontos);
Se é interpolação linear simples;
Se é muito grande será tal que seja zero em todos os pontos, ou seja, mínimos quadrados.

Splines vs Loess/Lowess
No spline se minimiza uma função-objetivo explícita, é mais elegante matematicamente que loess/lowess.
O ajuste dos dois é muito semelhante para o mesmo número de graus de liberdade.
Pode-se ajustar essas funções para diversos preditores.
Existe uma forma mais complexa de spline mais complexo para splines (thin plate splines) que pode ser usada em modelos GAM.
Prática em R
: Transformações e suavizações
Vamos continuar com nossa série de SRAG no Paraná:
# Visualizando a série temporal
plot(srag_pr_ts, ylab = "Casos de SRAG", xlab = "Tempo")
O comando plot(srag_pr_ts, ylab = "Casos de SRAG")
gera
um gráfico de linha da série temporal srag_pr_ts
, com o
eixo Y rotulado como “Casos de SRAG”.
Vamos aplicar as transformações vistas à série: transformação logarítmica, Box-Cox e diferenciação.
Para a transformação logarítmica podemos usar a própria função
log()
do R:
srag_pr_log<- log(srag_pr_ts)
plot(srag_pr_log, ylab = "Log(Casos)", xlab = "Tempo",
main = "Casos de SRAG no PR\nTransformação: Log")
Este código aplica uma transformação logarítmica aos dados da série
temporal srag_pr_ts
e exibe o gráfico da série
transformada.
srag_pr_log <- log(srag_pr_ts)
: Cria uma nova série,srag_pr_log
, contendo os logaritmos dos valores desrag_pr_ts
, suavizando variações extremas e tornando os dados mais adequados para análises de tendência e sazonalidade.plot(srag_pr_log, ylab = "Log(Casos)", main = "Casos de SRAG no PR\nTransformação: Log")
: Plota a série transformada com o rótulo do eixo Y como “Log(Casos)” e o título “Casos de SRAG no PR Transformação: Log”. O “n” é utilizado para quebrar a linha do título.
Vemos como a diferença entre os picos mais altos e dos mais baixos já
não é mais tão grande, ou seja, há uma redução na amplitude de variação
nos dados. Agora, vamos verificar como a série fica após a transformação
de Box-Cox, e para isso usaremos o pacote forecast
.

Atenção
De agora em diante, usaremos de forma intensiva o pacoteforecast
, que contém um conjunto de funções e utilidades na
tarefa de análise de séries temporais. Caso ele não esteja instalado em
seu ambiente R, basta executar o código abaixo. Acompanhe:
install.packages("forecast")
# Carregando o pacote
library(forecast)
# Aplicando a transformação de Box-Cox
srag_pr_bc1 <- BoxCox(srag_pr_ts, lambda = 0.1)
# Visualizando a série transformada
plot(srag_pr_bc1,
ylab = "Casos (transformado)",
main = "Casos de SRAG no PR\nTransformação: BoxCox, lambda = 0.1")
Este código aplica uma transformação de Box-Cox na série temporal
srag_pr_ts
para estabilizar a variância e facilitar a
modelagem.
library(forecast)
: Carrega o pacote forecast, que contém a função BoxCox.BoxCox(srag_pr_ts, lambda = 0.1)
: Aplica a transformação de Box-Cox com parâmetrolambda = 0.1
na sériesrag_pr_ts
, criando uma versão transformada,srag_pr_bc1
.plot()
: Exibe a série transformada com rótulo “Casos (transformado)” e título indicando a transformação.
Conforme vimos anteriormente, a transformação de Box-Cox requer o
parâmetro lambda
, que determina a forma da transformação.
No exemplo acima usamos lambda = 0.1
. Podemos testar
diferentes valores do parâmetro e comparar os resultados. Podemos testar
também, conforme visto anteriormente, o lambda automático, através do
comando BoxCox.lambda()
:
# Aplicando a transformação de Box-Cox
lambda_auto <- BoxCox.lambda(srag_pr_ts)
srag_pr_bc2 <- BoxCox(srag_pr_ts, lambda = lambda_auto)
# Visualizando a série transformada
plot(srag_pr_bc2,
ylab = "Casos (transformado)",
main = paste0(
"Casos de SRAG no PR\nTransformação: BoxCox, lambda = ",
round(lambda_auto, 2)
)
)
Esse código aplica a transformação de Box-Cox na série temporal
srag_pr_ts
para estabilizar a variância:
lambda_auto <- BoxCox.lambda(srag_pr_ts)
: Calcula o parâmetro lambda ideal para a transformação de Box-Cox, armazenando-o emlambda_auto
.srag_pr_bc2 <- BoxCox(srag_pr_ts, lambda = lambda_auto)
: Aplica a transformação de Box-Cox usando o lambda calculado para criarsrag_pr_bc2
, a série transformada.plot()
: Plota a série transformada com um título que exibe o valor de lambda arredondado.
Vemos que a diferença de amplitude entre as curvas diminui, aproximando-as. Como visto anteriormente, tais técnicas de transformação podem ser úteis nas etapas de modelagem da série temporal.
Podemos aplicar a última transformação vista: a diferenciação. Vimos
que a diferenciação é útil para remoção da tendência da série, contudo
já percebemos durante a última prática que a série não possui tendência
relevante. Assim, esperamos uma série parecida ao diferenciá-la. Vamos
testar por meio do comando diff()
:
par(mfrow = c(2,1))
# Diferenciação da série original
srag_pr_diff <- diff(srag_pr_ts)
plot(
srag_pr_diff,
ylab = "Diferença de casos",
main = "a. Casos de SRAG no PR\nTransformação: Diferenciação"
)
# Diferenciação da série já transformada
srag_pr_bc_diff <- diff(srag_pr_bc2)
plot(
srag_pr_bc_diff,
ylab = "Diferença de casos (transformado)",
main = "b. Casos de SRAG no PR\nTransformação: Box-Cox e Diferenciação"
)
Esse código cria um painel com dois gráficos para comparar transformações de diferenciação na série temporal de casos de SRAG:
par(mfrow = c(2,1))
: Define a disposição dos gráficos em duas linhas e uma coluna, permitindo a visualização dos dois gráficos um sobre o outro.srag_pr_diff <- diff(srag_pr_ts)
: Calcula a primeira diferenciação da sériesrag_pr_ts
, capturando mudanças entre períodos consecutivos.plot()
: Plota a série diferenciada, mostrando as diferenças nos casos de SRAG e destacando variações temporais.srag_pr_bc_diff <- diff(srag_pr_bc2)
: Calcula a primeira diferenciação da série transformada por Box-Coxsrag_pr_bc2
, uma técnica que ajusta a distribuição antes da diferenciação.plot()
: Plota a série diferenciada transformada, mostrando as diferenças após ambas as transformações.
Vemos que a diferenciação traz a média dos casos para zero e de uma forma constante, sem qualquer tendência (a). Contudo, somente esta transformação mantém a diferença na amplitude entre as curvas. Buscando estabilizar isso, transformamos também a série transformada por meio do método Box-Cox (b).
Suavizações
Podemos comparar também, diferentes estratégias vistas para obter uma suavização da série.
Médias móveis
Podemos obter a série suavizada por médias móveis por meio da função
ma()
, também do pacote forecast
.
plot(
srag_pr_ts,
ylab = "",
main = "Média Móvel Centrada"
)
lines(ma(srag_pr_ts, order = 10), col = 2, lty = 1, lwd = 2)
lines(ma(srag_pr_ts, order = 4), col = 4, lty = 2, lwd = 2)
legend("topright",
legend = c("Casos mensais", "Média Móvel 4", "Média Móvel 10"),
col = c("black", "blue", "red"),
lty = c(1, 2, 1),
cex = 1)
Esse código gera um gráfico da série temporal srag_pr_ts
com médias móveis centradas para suavizar e destacar tendências de curto
e longo prazo.
plot(srag_pr_ts, ylab = "", main = "Média Móvel Centrada")
: Plota a série temporalsrag_pr_ts
com o título “Média Móvel Centrada”.lines(ma(srag_pr_ts, order = 10), col = 2, lty = 1, lwd = 2)
: Adiciona uma linha de média móvel de ordem 10 (longa) em vermelho (col = 2
), linha contínua (lty = 1
) e espessura 2 (lwd = 2
).lines(ma(srag_pr_ts, order = 4), col = 4, lty = 2, lwd = 2)
: Adiciona uma linha de média móvel de ordem 4 (curta) em azul (col = 4
), linha tracejada (lty = 2
) e espessura 2.legend()
: Adiciona uma legenda no canto superior direito que identifica a série original, a média móvel de ordem 4 e a de ordem 10.
Vemos que a média móvel de ordem captura bem as variações importantes e suaviza a série de forma satisfatória, enquanto a média de ordem realiza uma suavização mais intensa, de forma a perder algumas flutuações relevantes na série. Note que o período que perdemos ao aumentar o valor de é maior, de forma que a série em vermelho se inicia em meados de 2013 e vai até meados de 2017.
Também vimos que podemos alinhar as médias móveis à esquerda ou à
direita, conforme o que for mais adequado. No R, podemos trocar esse
alinhamento com a função rollmean()
, do pacote
zoo
. Ela também é uma função para médias móveis, porém com
mais parâmetros:
library(zoo)
plot(srag_pr_ts, ylab = "", main = "Média Móvel Alinhada")
lines(rollmean(srag_pr_ts, k = 4, align = 'left'), col = "orange", lwd = 2)
lines(rollmean(srag_pr_ts, k = 4, align = 'right'), col = "purple", lwd = 2)
legend("topright", legend = c("Casos mensais", "Alinhada à esquerda", "Alinhada à direita"),
col = c("black", "orange", "purple"), lty = c(1, 1, 1), cex = 1)
Esse código utiliza o pacote zoo para plotar a série temporal
srag_pr_ts
com médias móveis alinhadas à esquerda e à
direita, destacando variações suavizadas na série.
plot(srag_pr_ts, ylab = "", main = "Média Móvel Alinhada")
: Plota a série temporal com o título “Média Móvel Alinhada”.lines(rollmean(srag_pr_ts, k = 4, align = 'left'), col = "orange", lwd = 2)
: Adiciona uma linha de média móvel de 4 períodos alinhada à esquerda, em laranja e espessura de 2.lines(rollmean(srag_pr_ts, k = 4, align = 'right'), col = "purple", lwd = 2)
: Adiciona uma linha de média móvel de 4 períodos alinhada à direita, em roxo e espessura de 2.legend()
: Adiciona uma legenda no canto superior direito para identificar as linhas.
Kernel
Vimos que outra possibilidade para obter uma suavização da série é a
utilização de uma função de kernel. Há inúmeras possibilidades de
realizar essa operação em R, sendo a mais simples por meio da utilização
da função ksmooth()
. Nela, passamos os valores de
x
e y
da relação que queremos suavizar. Como
estamos tratando de uma série temporal, nosso valor de x representa o
momento da série temporal (podemos obtê-lo com a função
time()
), e y é o próprio valor da série. Dessa forma,
podemos implementar uma suavização por kernel, variando os valores da
largura de banda, que determina a quantidade de suavização:
kernel1 <- ksmooth(time(srag_pr_ts), srag_pr_ts, kernel = "normal", bandwidth = 0.3)
kernel2 <- ksmooth(time(srag_pr_ts), srag_pr_ts, kernel = "normal", bandwidth = 0.5)
kernel3 <- ksmooth(time(srag_pr_ts), srag_pr_ts, kernel = "normal", bandwidth = 1)
plot(
x = srag_pr_ts,
ylab="",
main="Suavização por Kernel"
)
lines(kernel1$x, kernel1$y, col = 3)
lines(kernel2$x, kernel2$y, col = 2)
lines(kernel3$x, kernel3$y, col = 4)
legend("topright",c("0,3 meses","0,5 meses","1 mês"),fill=c(3,2,4), title="Janela",bty="n")
Esse código aplica a suavização por kernel à série temporal
srag_pr_ts
com diferentes larguras de banda para analisar
tendências:
ksmooth()
: Suaviza a série temporal usando o kernel “normal” com três larguras de banda distintas (0.3, 0.5 e 1). Larguras de banda menores captam mais detalhes, enquanto maiores produzem uma suavização mais geral.plot()
: Plota a série original.lines()
: Adiciona as linhas suavizadas de kernel1, kernel2 e kernel3 com cores diferentes.legend()
: Adiciona uma legenda no canto superior direito, indicando as diferentes larguras de banda e suas respectivas cores.
Vemos que, conforme aumentamos a largura de banda, a suavização aplicada é maior. O kernel com largura de 1 mês, por exemplo, captura apenas as variações mais longas da série.
Lowess
A suavização por meio do método lowess se dá de forma parecida em R,
com a função lowess()
. Neste caso, apenas temos que
escrever nossos parâmetros na forma de uma fórmula, ou seja:
y ~ x
. Veja abaixo:
lowess1 <- lowess(srag_pr_ts ~ time(srag_pr_ts), f = 0.1)
lowess2 <- lowess(srag_pr_ts ~ time(srag_pr_ts), f = 0.4)
plot(srag_pr_ts, ylab = "", main = "Suavização por Lowess")
lines(lowess1$x, lowess1$y, col = 4)
lines(lowess2$x, lowess2$y, col = 2)
legend(
"topright",
c("f=0.1", "f=0.4"),
col = c(4, 2),
title = "",
bty = "n",
lty = c(1, 1)
)
Esse código aplica a suavização Lowess na série temporal
srag_pr_ts
usando duas intensidades de suavização
diferentes (f = 0.1
e f = 0.4
), e plota os
resultados para comparação.
lowess1
elowess2
: Guardam as suavizações desrag_pr_ts
com os parâmetrosf = 0.1
(mais sensível às variações) ef = 0.4
(mais suave), ondef
controla a fração dos dados usada em cada ponto de suavização.plot()
: Plota a série temporal original com o título “Suavização por Lowess”.lines(lowess1$x, lowess1$y, col = 4)
elines(lowess2$x, lowess2$y, col = 2)
: Adicionam as linhas de suavização paralowess1
(em azul) elowess2
(em vermelho).legend()
: Coloca uma legenda no canto superior direito (topright
), indicando os valores def
usados para cada linha.
De forma similar ao aumentarmos o parâmetro f
, que
determina a janela de suavização, temos uma suavização mais expressiva.
Ao utilizarmos um valor menor, como f = 0.1
, vemos que
alguns pontos ainda mantêm uma variação brusca.
Splines
A função utilizada para ajustar splines é a
smooth.spline
. Tentemos comparar alguns cenários com
diferentes graus de liberdade (df):
spline1 <- smooth.spline(time(srag_pr_ts), srag_pr_ts, df = 10)
spline2 <- smooth.spline(time(srag_pr_ts), srag_pr_ts, df = 50)
spline3 <- smooth.spline(time(srag_pr_ts), srag_pr_ts, df = 5)
plot(srag_pr_ts, ylab = "", main = "Suavização por Spline")
lines(spline1$x, spline1$y, col = 3)
lines(spline2$x, spline2$y, col = 4)
lines(spline3$x, spline3$y, col = 2)
legend(
"topright",
c("df=10", "df=50", "df=2"),
col = c(3, 4, 2),
lty = c(1, 1, 1),
title = "Janela",
bty = "n"
)
Esse código aplica suavizações por splines com diferentes graus de
liberdade (df) na série temporal srag_pr_ts
, e plota as
linhas suavizadas no gráfico para comparação.
spline1
,spline2
,spline3
: Criam três suavizações por splines usandosmooth.spline
, com graus de liberdade de 10, 50 e 5, respectivamente, ajustando diferentes níveis de suavidade.plot(srag_pr_ts, ylab = "", main = "Suavização por Spline")
: Plota a série temporal original sem rótulo no eixo Y e com o título “Suavização por Spline”.lines()
: Adiciona ao gráfico as três curvas suavizadas (verde, azul e vermelha) usando os resultados despline1
,spline2
espline3
.legend()
: Adiciona uma legenda no canto superior direito, especificando os diferentes graus de liberdade (10, 50 e 5) e suas cores.
Vemos que as splines produzem curvas suaves e contínuas, que se ajustam aos padrões dos dados. Diferentemente das outras abordagens, vemos que ao aumentar os graus de liberdade (df), temos curvas menos suaves e mais ajustadas aos dados, enquanto poucos graus mostram uma tendência mais geral dos dados.
Pronto! Agora você já sabe tudo sobre os componentes de uma série temporal, como transformá-la para reduzir sua variação ou remover sua tendência, e estratégias de suavização para obter padrões mais claros. No próximo módulo, vamos aprender a modelar as séries temporais para ajudar a descrevê-la, testar associações e realizar previsões.