\documentclass[a4paper, oneside, 10pt]{article}
\usepackage[unicode]{hyperref}
\usepackage[utf8x]{inputenc}
\usepackage[english]{babel}
\usepackage{listings}
\date{\today}
\title{}
\author{}
\begin{document}



\section{\texorpdfstring{Trabalho Final}{Trabalho Final}}
\label{sec:trabalho_final}


\subsection{\texorpdfstring{function.ema}{functionema}}
\label{sec:functionema}


\textbf{\emph{Código da função}}\lstset{frame=single}
\begin{lstlisting}

#######################################################################
# FUNÇÃO PARA CÁLCULO DO ERRO MÉDIO ABSOLUTO e PLOT DA SÉRIE DE DADOS #
#######################################################################

rm(list = ls())      # função que limpa o ambiente de trabalho
library(openair)     # a function.ema requer o pacote openair para realizar a média dos dados

# FUNÇÃO PARA CÁLCULO DO ERRO MÉDIO ABSOLUTO
# argumentos da function, onde mydata = dados de entrada do usuário, que deve ser um data.frame chamado mydata,
# e min e max= o range de registro do equipamento do usuário da função, por default, a função utilizará o min=-25
# e max=50.
function.ema <- function(mydata, min=-25, max=50)   # function.ema e seus argumentos
{  
  # função para transformar objeto de uma classe em duas classes para representar datas/horas 
  mydata$date = as.POSIXct(mydata$date, tz="GMT")  
                                         
  # cria um data.frame com os dados filtrados, ou seja, aplica em todas as linhas de todas colunas, exceto na
  # primeira coluna, uma função para transformar em NA todos os dados que estão fora do range de coleta do 
  # equipamento     
  filtered_data <- apply(mydata[,-1], 2, 
                         function(x){x[which(x<min | x>max)] = NA; return(x)})                                    
                  
  # cria um novo data.frame organizado, onde a primeira coluna será a data e as demais colunas serão o data.frame
  # criado na etapa anterior, com os dados filtrados
  mydt <- data.frame(date=mydata$date, filtered_data)  
  
  # cria um novo data.frame, aplicando a função do pacote openair que calcula a média diária, caso os dados do
  # usuário sejam horários, fixando também o mínimo de 1% de dados não sendo NA para que a média não seja NA
  temp_dia <- timeAverage(mydt, avg.time="day", statistic="mean", data.thresh=1)
  
  # aplica o cálculo do erro médio absoluto em todas as linhas e colunas, exceto na primeira coluna
  # ou seja, diminuirá o valor observado de cada dia de cada estação, pela média da série de dados daquela estação
  # em módulo e somará os resultados, dividindo-os pelo número de observações de cada estação
  ema_temp_dia <- apply(temp_dia[,-1], 2, 
                        function(x) {x <- sum(abs(x[!is.na(x)] - mean(x, na.rm=T)))/length(!is.na(x))})
  
# PLOT DA SÉRIE DE DADOS
  # A função plotará 4 gráficos das séries de dados com linhas indicando a média da série mais desvio padrão 
  # e a média menos o desvio padrão. 
  
  # cria a matriz onde serão plotados os gráficos
  layout(matrix(c(1,2,3,4,5,5), ncol = 2, byrow = TRUE), heights=c(1.5, 1.5))
  par(mai=c(.5,.5,.5,.5)) # especifica as margens
  for (col_nb in 2:5){
    plot(mydata[,col_nb], pch = 20, xaxt='n', bty="l", ann=F)  # indica o que será plotado
    title(main = names((mydata)[col_nb]), line = 0.7) # define como título de cada gráfico o nome da coluna da série
    title(xlab = "Série de Dados", line=0.5)  # define o texto do eixo x
    title(ylab = "Temperatura °C", line =2.5) # define o texto do eixo y
    limsup = mean(mydata[,col_nb], na.rm=T) + sd(mydata[,col_nb], na.rm=T) # calcula o desvio padrão mais média da 
                                                                           # série de dados de cada coluna
    limsub = mean(mydata[,col_nb], na.rm=T) - sd(mydata[,col_nb], na.rm=T) # calcula o desvio padrão menos média da 
                                                                           # série de dados de cada coluna
    abline(h=limsup, col="royalblue1", lwd=3) # gera uma abline com a limsup
    abline(h=limsub , col="royalblue4", lwd=3) # gera uma abline com a limsub
  }
  par(mai=c(0,0,0,0)) # especifica as margens da legenda
  plot.new() # plota a legenda
  legend(x="top",legend = c("Média + Desvio Padrão", "Média - Desvio Padrão"),  # indica o texto da legenda, as cores
         col=c("royalblue1","royalblue4"), lwd=4, cex=1, horiz=TRUE)            # e os tamanhos
  
  return(ema_temp_dia)  # retorna o erro média absoluto da série de dados analisada no console
}
\end{lstlisting}



\textbf{\emph{Arquivo da função e Série de dados}}

Arquivo .r da função e série de dados para melhor visualizar o resultado da função.

\href{media/bie5782/01_curso_atual/alunos/trabalho_final/mchitolina/script_functionema.r}{script\_functionema.r}

\href{media/bie5782/01_curso_atual/alunos/trabalho_final/mchitolina/mydata.csv}{mydata.csv}

\textbf{\emph{Help da função}}\lstset{frame=single}
\begin{lstlisting}


function.ema              package:nenhum                R Documentation

Função para calcular o Erro Médio Absoluto

Descrição:
Função para o cálculo do erro médio absoluto em dados meteorológicos e plotagem de gráficos da série de dados com o desvio padrão.
	
Uso:
function(mydata, min=-25, max=50)

Argumentos:
mydata	 Um objeto contendo um data.frame com uma coluna com as datas de observação dos dados e outra(outras) com o os dados observados (estes dados devem ser pelo menos diários).
min	 o valor mínimo de registro do equipamento, por default a função  utilizará o valor de -25.
max	 o valor máximo de registro do equipamento, por default a função utilizará o valor de 50.

Detalhes:
A função calcula o erro médio absoluto da série de dados, que consiste na
somatória dos erros absolutos em módulo e na divisão do valor pelo número de dados observados 
E também plota gráficos da série de dados com linhas indicando a média da série mais desvio padrão e a média menos o desvio padrão. 

Advertências:
O objeto de entrada da função deve ser objeto chamado mydata, da classe data.frame, onde a primeira coluna contém a data de observação de cada dado e as outras, a série de dados de cada estação. 
O dado de entrada pode conter o número de estações que usuário que quiser analisar.
A função exige o pacote “Openair".
Os plots serão melhor visualizados se o dados do usuário forem dados no máximo horários.

Autora:
Mariane Chitolina
mchitolina@usp.br


Exemplo:
# Criando as sequência de dados para cada estação
est_01 <- c(seq(26.71, 15.51, len= 24), seq(14.35, 25.54, len= 24))
est_02 <- c(seq(18.71, 15.51, len= 24), seq(14.35, 21.54, len= 24))
est_03 <- c(seq(31.71, 15.51, len= 24), seq(14.35, 25.54, len= 24))
est_04 <- c(seq(17.71, 14.51, len= 24), seq(13.35, 22.54, len= 24))

# Criando a sequência da coluna date
date <- seq(ISOdate(2000,1,1), by = "hour", length.out = 48)

# Criando um data.frame com 5 colunas e 48 linhas, sendo a primeira coluna a sequência de datas e horas
mydata <- data.frame(date, est_01, est_02, est_03, est_04)
     
# Rodando a função
function.ema(mydata)
\end{lstlisting}



\textbf{\emph{Arquivo do help}}

\href{media/bie5782/01_curso_atual/alunos/trabalho_final/mchitolina/help_functionema.txt}{help\_functionema.txt}

\end{document}
