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



\section{\texorpdfstring{Patricia Marques Moralejo Bermudi}{Patricia Marques Moralejo Bermudi}}
\label{sec:patricia_marques_moralejo_bermudi}


\includegraphics[keepaspectratio=true,width=0.8\textwidth]{bie5782/01_curso_atual/alunos/trabalho_final/patricia.bermudi/imagem_patricia}


Graduada e mestranda em Saúde Pública, Faculdade de Saúde Pública, USP.

Projeto de pesquisa: Análise espacial e espaço-temporal dos óbitos por câncer de mama e de colo de útero, município de São Paulo, 2000 a 2016. 

Orientador: Francisco Chiaravalloti Neto.

Co-orientadora: Alessandra Cristina Guedes Pellini

\subsection{\texorpdfstring{Meus exercícios}{Meus exercicios}}
\label{sec:meus_exercicios}


Link para acesso aos meus \href{http://ecor.ib.usp.br./doku.php?id=05_curso_antigo:r2019:alunos:trabalho_final:patricia.bermudi:exercicios}{.:exercícios}. 

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


\subsubsection{\texorpdfstring{Código da função: Padronização direta de taxas}{Codigo da funao Padronizaao direta de taxas}}
\label{sec:codigo_da_funao_padronizaao_direta_de_taxas}
\lstset{frame=single}
\begin{lstlisting}

## Função para Padronização direta de taxas

stRate  <-  function (df.event, df.pop, df.pop.st = NULL, mult = 100000, 
                      crude.rt = TRUE) { #Atribui ao objeto "stRate" a função 
  #com os argumentos que estão listados entre virgulas, dentro dos parênteses.
  
#### Realizando os controles de fluxo 
  
  ## CONTROLE DE FLUXO: Os objetos de entrada df.event; df.pop; (e df.pop.st,
  #se for o caso) são da classe data.frame?
  
  if (class(df.event) != "data.frame" | class(df.pop) != "data.frame") { #Se a
    #classe do objeto 'df.event' for diferente de "data.frame" ou a classe do 
    #objeto "df.pop" for diferente da classe "data.frame".
    stop ("Os objetos 'df.event' e 'df.pop' devem possuir a classe data.frame. Faça as correções necessárias e rode a função novamente.")} 
  # Então, a função para e retorna uma mensagem de erro.
  if (!is.null(df.pop.st) & class(df.pop.st) != "data.frame") { # Se o usuário 
    #escolheu colocar um objeto no argumento 'df.pop.st', ou seja, se este for 
    #diferente de nulo no argumento da função  "E" a classe do objeto inserido 
    #pelo usuário para esse argumento for diferente de "data.frame." 
    stop ("O objeto 'df.pop.st' deve possuir a classe data.frame. Faça as correções necessárias e rode a função novamente.")} #Então, a 
  #função para e retorna uma mensagem de erro.
  
  ## CONTROLE DE FLUXO: Os objetos de entrada df.event; df.pop; ( e df.pop.st, 
  #se for o caso) contém na posição [1] uma coluna de identificação? Se não, a 
  #função para e retorna uma mensagem ao usuário para correção. 
  
  ANSWER_1 <- readline(prompt = " \n PERGUNTA 01/02: DIGITE SUA RESPOSTA AQUI NO CONSOLE! 
       \n A PRIMEIRA COLUNA EM TODOS OS SEUS OBJETOS DE ENTRADA 
          CORRESPONDE À UMA COLUNA DE IDENTIFICAÇÃO (ID) ? \n
          O ID DEVE APRESENTAR A MESMA SEQUÊNCIA EM TODOS OS OBJETOS. 
                       DIGITE s para SIM ou n para NÃO: s / n ? ") #Atribui ao 
  #objeto "ANSWER_1" a função 'readline' que irá exibir um prompt na tela do 
  #console com uma pergunta que deverá ser respondida pelo usuário digitando 
  #"s" para sim ou "n" para não.
  
  if(ANSWER_1 == "n") { #Se a resposta for igual a não
    stop ("Insira uma coluna de identificação na posição 1 [, 1] em todos os objetos de entrada. Esta coluna não precisa ser numérica, mas deve apresentar a mesma sequência entre todos os objeto de entrada. Faça as correções necessárias e rode a função novamente.")} # Então, a função para e retorna uma mensagem de erro.
  
  # Observação: como o campo de ID sempre é aconselhável estar presente em um 
  #banco de dados. A função foi construída para realizar as operações 
  #considerando este ID e realizando as operações sempre a partir da coluna de 
  #posição 2. Desde modo, o usuário é notificado disso e, ao digitar sim
  #, assume a responsabilidade de que o não cumprimento deste critério 
  #compromete os resultados finais da função.
  
  #Essa coluna de identificação não precisa ser numérica. Pode ser nome do
  #município, por exemplo. 
  
  ## CONTROLE DE FLUXO: Os objetos de entrada df.event; df.pop; ( e df.pop.st, 
  #se for o caso) contém nas posições [2] em diante de colunas, variáveis 
  #numéricas com as respectivas contagens? Se não, a função para e retorna uma 
  #mensagem ao usuário para correção.
  
  if(any (apply(df.event [, 2: ncol(df.event)], 2, is.character)) #Se qualquer 
     #observação for caractere em qualquer linha, entre a coluna  dois até a 
     #última coluna (especificado por meio do n° total de colunas) do objeto 
     #'df.event' 
     | any (apply(df.pop[, 2: ncol(df.pop)], 2, is.character)) # OU se qualquer
     #observação for caractere em qualquer linha, entre a coluna  dois até a 
     #última coluna (especificado por meio do n° total de colunas) do objeto 
     #'df.pop' 
     | any (apply(df.event [, 2: ncol(df.event)], 2, is.logical)) #'OU' se 
     #qualquer observação for lógica em qualquer linha, entre a coluna  dois 
     #até a última coluna (especificado por meio do n° total de colunas) do 
     #objeto 'df.event'  
     | any (apply(df.pop[, 2: ncol(df.pop)], 2, is.logical))) { # OU se 
    #qualquer observação for lógica em qualquer linha, entre a coluna  dois até
    #a última coluna (especificado por meio do n° total de colunas) do objeto 
    #'df.pop'
    ( stop("Em todas as colunas (exceto a primeira, de identificação (ID)) dos objetos de entrada, as observações contidas devem ser números (numéricas)! Faça as correções necessárias e rode a função novamente.")) } # Então, a função para e retorna uma mensagem de erro.
  
  #Observação: o ideal seria utilizar "!is.numeric", porém a função apply não 
  #aceita esta opção. 
  
  if (!is.null(df.pop.st)) { # Se o usuário escolheu colocar um objeto no 
    #argumento 'df.pop.st', ou seja, se este for diferente de nulo no argumento
    #da função 
    if(any (apply(df.pop.st [, 2: ncol(df.pop.st)], 2, is.character)) # Se o 
       #usuário escolheu colocar um objeto no argumento 'df.pop.st', ou seja, 
       #se este for diferente de nulo no argumento da função 
       | any (apply(df.pop.st [, 2: ncol(df.pop.st)], 2,  is.logical))){ #OU se
      #qualquer observação for lógica em qualquer linha, entre a coluna  dois 
      #até a última coluna (especificado por meio do n° total de colunas) do 
      #objeto 'df.pop.st'
    stop("Em todas as colunas (exceto a primeira, de identificação) do objeto de entrada 'df.pop.st', as observações contidas devem ser números (numéricas)! Faça as correções necessárias e rode a função novamente.") # Então, a função para e retorna uma mensagem de erro.
  } }
  
  ## CONTROLE DE FLUXO: Os objetos de entrada df.event; df.pop; ( e df.pop.st, 
  #se for o caso) contém o mesmo número de linhas (locais ou ano) e colunas 
  #(variáveis)? Se não, a função para e retorna uma mensagem ao usuário para 
  #correção.
  
  if (ncol(df.event) != ncol(df.pop) | nrow(df.event) != nrow(df.pop)) { #Se o 
    #número de colunas do objeto 'df.event' for diferente do número de colunas 
    #do objeto 'df.pop' "OU" se o número de linhas do objeto 'df.event' for 
    #diferente do número de linhas do objeto 'df.pop'
    stop ("Os objetos 'df.event' e 'df.pop' devem possuir o mesmo número de linhas (localidade) e o mesmo número de colunas (id e colunas dos estratos que serão utilizadas na padronização), as observações contidas devem ser números (numéricas)! Faça as correções necessárias e rode a função novamente.") # Então, a função para e retorna uma mensagem de erro.
  }
  
  if (!is.null(df.pop.st)) { #Se o usuário escolheu colocar um objeto no 
    #argumento 'df.pop.st', ou seja, se este for diferente de nulo no argumento 
    #da função 
    if (ncol(df.pop.st) != ncol(df.event) | nrow(df.pop.st) != nrow(df.event)){
      #Se o número de colunas do objeto 'df.pop.st' for diferente do número de 
      #colunas do objeto 'df.event' "OU" se o número de linhas do objeto 
      #'df.pop.st' for diferente do número de linhas do objeto 'df.event'
    stop ("Os objetos 'df.pop.st', 'df.event' e 'df.pop' devem possuir o mesmo 
          número de linhas (localidade) e o mesmo número de colunas (id e 
        colunas dos estratos que serão utilizadas na padronização). Faça as correções necessárias e rode a função novamente.") #Então, a função 
      #para e retorna uma mensagem de erro.
   } }
  
  ## CONTROLE DE FLUXO: Os objetos de entrada df.pop; ( e df.pop.st, se for o 
  #caso) contém o valor zero ou NA? Se sim, a função para e retorna uma 
  #mensagem ao usuário para correção.
   
  if(any (apply(df.event [, 2: ncol(df.event)], 2, is.na)) #Se qualquer 
     #observação for NA em qualquer linha, entre a coluna dois até a última 
     #coluna (especificado por meio do n° total de colunas) do objeto
     #'df.event'
     | any (apply(df.pop [, 2: ncol(df.pop)], 2, is.na))){ # OU se qualquer 
    #observação for NA em qualquer linha, entre a coluna dois até a última 
    #coluna (especificado por meio do n° total de colunas) do objeto 'df.pop'
    stop("Os objetos de entrada 'de.event'e 'df.pop' NÃO devem possuir nenhum valor NA. Faça as correções necessárias e rode a função novamente.") # Então, a função para e retorna uma mensagem de 
    #erro.
  } else if (any (df.pop [, 2:ncol(df.pop)] == 0)) { # Se não e se qualquer 
    #observação for ZERO em qualquer linha, entre a coluna dois até a última 
    #coluna (especificado por meio do n° total de colunas) do objeto 'df.pop'
    stop("O objeto 'df.pop' NÃO deve possuir nenhum valor zero. Faça as observações contidas devem ser números (numéricas)! Faça as correções necessárias e rode a função novamente.") # Então, a função para e retorna 
    #uma mensagem de erro.
  } 
  
  #Observação: A conferência para valores zero precisa ser posterior a 
  #conferência de NAs para não ocorrer erro. Além disso, a conferência para 
  #valores zero só é necessária para o denominador, ou seja, população, uma vez
  #que não se pode dividir por zero. 
  
 #Há diferentes maneiras de lidar com valores zero no banco, optou-se por 
  #deixar o usuário escolher sua maneira, resolver fora da função e 
  #posteriormente retornar a função.  

  if (!is.null(df.pop.st)) { #Se o usuário escolheu colocar um objeto no 
    #argumento 'df.pop.st', ou seja, se este for diferente de nulo no argumento
    #da função 
    if(any (apply(df.pop.st [, 2: ncol(df.pop.st)], 2, is.na))) { #Se qualquer observação for NA em qualquer linha, entre a coluna dois até a última coluna (especificado por meio do n° total de colunas) do objeto 'df.pop.st'
      stop("O objeto de entrada 'df.pop.st'NÃO deve possuir nenhum valor NA. Faça as correções necessárias e rode a função novamente.")  #Então, a função para e retorna uma mensagem de erro.
    } else if (any (df.pop.st[, 2:ncol(df.pop.st)] == 0)) #Se não e se qualquer
      #observação for ZERO em qualquer linha, entre a coluna dois até a última 
      #coluna (especificado por meio do n° total de colunas) do objeto 
      #'df.pop.st'
    stop("O objeto de entrada 'df.pop.st'NÃO deve possuir nenhum valor zero. Faça as correções necessárias e rode a função novamente.") #Então, a função para e retorna
    #uma mensagem de erro.
  }
  
  ## CONTROLE DE FLUXO: O usuário respondeu (por meio da função readline) que 
  #seus dataframes fornecidos NÃO possuem a mesma sequência em relação aos 
  #extratos? Se não, a função para e retorna uma mensagem ao usuário para 
  #correção.

ANSWER_2 <- readline(prompt = " \n PERGUNTA 02/02: \n 
AS DEMAIS COLUNAS APRESENTAM A MESMA ORDEM (MESMA POSIÇÃO DE COLUNAS) 
EM TODOS OS OBJETOS DE ENTRADA?\n 
                    DIGITE s para SIM ou n para NÃO: s / n ? ") #Atribui ao 
#objeto "ANSWER_2" a função 'readline' que irá exibir um prompt na tela do 
#console com uma pergunta que deverá ser respondida pelo usuário digitando "s" 
#para sim ou "n" para não.
if(ANSWER_2 == "n") { #Se a resposta for igual a não
  stop ("Os objetos de entrada devem apresentar a mesma sequência em relação aos estratos. Exemplo: Se você colocou a coluna referente a contagem pela faixa etária de 00 a 14 anos de idades na posição 2 de coluna [, 2] no objeto 'df.event', então, esta coluna deve ocupar a mesma posição, posição 2 de coluna [, 2] no objeto 'df.pop'. Faça as correções necessárias e rode a função novamente.") #Então, a função para e retorna uma mensagem de erro.
}

#Observação: este controle evita que o usuário insira objetos com diferentes 
#ordens das sequencias de estratos entre os mesmos. Assim, o usuário recebe a 
#informação que seus estratos precisam estar na mesma de sequência em relação 
#as colunas e digitando "sim", assume a responsabilidade, uma vez que ordens 
#diferentes irão resultar em resultados errôneos. 

  ## CONTROLE DE FLUXO: O usuário deixou a opção df.pop.st = NULL? Se sim, 
#verifica se os objetos de entrada df.event; df.pop contém quatro colunas. 
#Se sim, mostrar uma mensagem que será utilizada a população padrão da OMS. 
#Se não, a função para e retorna uma mensagem ao usuário para correção.

if (is.null(df.pop.st) & ((ncol(df.event) != 4)  #Se o usuário deixou a opção
    #'df.pop.st' como default , ou seja, igual a nulo 
    #no argumento da função "E" o  número de colunas do objeto 'df.event' for 
    #diferente de 4 
                          | is.null(df.pop.st) & (ncol(df.pop) != 4))) { #OU se 
  #o usuário escolheu colocar um objeto no argumento 'df.pop.st', ou seja, se 
  #este for diferente de nulo no argumento da função "E" o número de colunas do 
  #objeto 'df.pop' for diferente de 4 
  stop ("O banco utilizado para a padronização será o da OMS, com um ID e três colunas de estratos etários (estrato 1: 00 a 14 anos de idade; estrato 2: 15 a 59 anos de idade; e estrato 3: 60 anos e mais de idade). Nesta ordem! Portanto, os objetos 'df.event' e 'df.pop' devem também ter quatro colunas. A primeira correspondente ao ID e as demais com a mesma ordem de estratos que o banco da OMS. Faça as correções necessárias e rode a função novamente.") #Então, a função para e retorna uma mensagem de erro.
} 

if (is.null(df.pop.st)) { #Se o usuário deixou a opção 'df.pop.st' como default
  #ou seja, igual a nulo  
  cat(" \n \t A população padrão que está sendo utilizada é a da OMS, conforme consta no HELP \n \n") 
  #Se não, é apresentado no console uma mensagem de que a população padrão 
  #utilizada é a da OMS
}

#Observação: este controle é necessário, porque a opção default de df.pop.st' 
#apresenta 4 colunas. Logo, os objetos de entrada também devem apresentar este 
#número. 

#### Construindo o banco de dados com a população padrão da OMS para ser utilizada 
#caso o usuário mantenha a opção default 'df.pop.st' = NULL. 

if(is.null(df.pop.st)) { # Se o usuário escolheu manter a opção default para 
  #'df.pop.st', ou seja, 'df.pop.st' = NULL
  df.pop.st <- data.frame(cod = df.event[1], #Então é atribuído ao objeto 
        #'df.pop.st' um data.frame, com a primeira coluna correspondente a 
        #'#primeira coluna do objeto 'df.event', com o nome "cod"
                          poppadr00_14 = rep(26139, nrow(df.event)), #A segunda 
        #coluna corresponde a repetição do valor da população padrão da OMS de 
        #00 a 14 anos de idade. O número de repetições é equivalente ao número 
        #de linhas do objeto 'df.event', com o nome da coluna correspondente a 
        #"poppadr00_14"
                          poppadr15_59 = rep(61920, nrow(df.event)), # A terceira 
        #coluna corresponde a repetição do valor da população padrão da OMS de 
        #15 a 59 anos de idade. O número de repetições é equivalente ao número 
        #de linhas do objeto 'df.event', com o nome da coluna correspondente a 
        #"poppadr15_59"
                          poppadr60_em = rep(11941, nrow(df.event))) } # A quarta 
        #coluna corresponde a repetição do valor da população padrão da OMS de 
        #60 anos e mais de idade. O número de repetições é equivalente ao número 
        #de linhas do objeto 'df.event', com o nome da coluna correspondente a 
        #poppadr60_em"

#### Criando uma matriz vazia para receber o valor de eventos que seriam esperados 
#caso a população observada correspondesse ao valor da população padronizada. 

ob_esp <- matrix(NA, ncol = ncol(df.event), nrow = nrow(df.event)) #Atribui ao 
#objeto "ob_esp" uma matriz com valores NA, com o número de colunas correspondente 
#ao número de colunas do objeto 'df.event' e com o número de linhas correspondente 
#ao número de linhas do objeto 'df.event'

#### Criando um ciclo para preencher os valores de eventos esperados. 

#Regra de três para cada estrato: "Evento observado" está para "População observada", 
#assim como "Evento esperado" está para a "População padrão"

# "Evento esperado" é igual a multiplicação do "Evento observado" pela 
#"População padrão" correspondente, dividido pela "População observada" também 
#correspondente  

for(i in 1:nrow(df.event)){ # Para o contador i indo de 1 até o número de linhas 
  #do objeto 'df.event'
  for (j in 2:ncol(df.event)){ #Para o contador j indo de 2 até o número de 
    #colunas do objeto 'df.event' ( a coluna 1 ficará vazia) 
    ob_esp[i, j] <- (df.event[i, j] * df.pop.st[i, j]) / df.pop[i, j] #Atribui 
    #ao objeto 'ob_esp' na posição i de linha, que no primeiro ciclo é 1, e na 
    #posição j de coluna, que no primeiro ciclo é 2, a multiplicação do valor do 
    #objeto 'df.event', na mesma posição de linha e coluna, com o valor do objeto 
    #'df.pop.st', na mesma posição de linha e coluna, com o resultado dividido 
    #pelo valor do objeto 'df.pop' na mesma posição de linha e coluna  
  }
}

ob_esp <- data.frame(ob_esp) # Faz a coerção do objeto "ob_esp" para data.frame 
#### Calculando a taxa padronizada 

st_rate <- data.frame (cod = df.event[1], #Atribui ao objeto 'st_rate' um 
                       #data.frame com a primeira coluna correspondente à primeira 
                       #coluna do objeto 'df.event', com o nome "cod"
            st_rt = round((apply(ob_esp [, 2:ncol(ob_esp)], 1, sum) * mult ) # A 
                      #segunda coluna corresponde a soma, por linha, dos valores 
                      #do objeto 'ob_esp' entre a coluna 2 até a última coluna 
                      #(especificado por meio do n° total de colunas do objeto 
                      #''ob_esp'). Este resultado multiplicado pelo objeto 'mult'
            / apply(df.pop.st[, 2:ncol(df.pop.st)], 1, sum), 2)) # Este resultado 
                     #dividido pela soma, por linha, dos valores do objeto 
                      #'df.pop.st' entre a coluna 2 até a última coluna (especificado 
                      #'#por meio do n° total de colunas do objeto 'df.pop.st'). 
                      #'#Este resultado arredondado para duas casas decimais 

#### Calculando a taxa não ajustada (Bruta)

if(crude.rt ==  TRUE) { #  Se o usuário escolheu manter a opção default para 
  #'crude.rt', ou seja, 'crude.rt' = TRUE
  crude.rt <- data.frame (cod = df.event[1], # Então é atribuído ao objeto 
                          #"crude.rt" um data.frame com a primeira coluna correspondente
                          #rimeira coluna do objeto 'df.event', com o nome "cod"
      crude.rt  =  round((apply(df.event [, 2:ncol(df.event)], 1, sum) * # A segunda 
                            #coluna corresponde a soma, por linha, dos valores do objeto 
                            #'df.event' entre a coluna 2 até a última coluna 
                            #(especificado por meio do n° total de colunas 
                            #do objeto ''df.event). 
                      mult ) / apply(df.pop [, 2:ncol(df.pop)], 1, sum), 2))# Este 
  #resultado multiplicado pelo objeto 'mult'. Em seguida, o novo resultado é dividido 
  #pela soma, por linha, dos valores do objeto 'df.pop' entre a coluna 2 até a última 
  #coluna (especificado por meio do n° total de colunas do objeto 'df.pop'). 
  #Este resultado é arredondado para duas casas decimais 
  
  exit <- cbind(crude.rt , st_rate[, -1]) #Atribui ao objeto "exit" a junção por
  #colunas dos objetos 'crude.rt' e 'st_rate[, -1]' com exceção da primeira coluna,
  #para que no banco não tenham dois campos de identificação 
  
  names(exit) <- c("ID", "Taxa Bruta", "Taxa Padronizada") #Renomeia os nomes 
  #das colunas do objeto 'exit'
  
} else { # Se não, se o usuário selecionou a opção 'crude.rt' = FALSE
  exit <- st_rate # Então, atribui ao objeto 'exit' apenas a taxa padronizada, 
  #objeto 'st_rate'
  
  names(exit) <- c("ID",  "Taxa Padronizada") # Renomeia os nomes das colunas 
  #do objeto 'exit'
}

return (exit) # Retorna o objeto 'exit'
}
\end{lstlisting}



\subsubsection{\texorpdfstring{Texto de ajuda}{Texto de ajuda}}
\label{sec:texto_de_ajuda}
\lstset{frame=single}
\begin{lstlisting}

stRate             package:unknown 			          R Documentation

 ~~ Função para padronizar taxas pelo método direto~~

Description

 ~~ A função calcula as taxas não ajustadas e faz a padronização direta por idade das taxas de um evento por 100 mil habitantes, utilizando como população padrão a da Organização Mundial da Saúde. Também permite padronizar por outras variáveis de interesse e utilizar outra população padrão. ~~ 

Usage

~~ stRate(df.event, df.pop, df.pop.st = NULL, mult = 100000, crude.rt = T)~~ 

Arguments


~~''df.event''	Um data.frame com uma coluna de identificação na primeira posição de coluna [, 1] e com a contagem de eventos observados por estratos, nas demais posições de colunas. Se ''df.pop.st'' = NULL, os estratos de ''df.event'' deverão ser os mesmos que os contidos no argumento ''df.pop.st''. ~~

~~''df.pop'' 	Um data.frame com a mesma coluna de identificação do objeto ''df.event'', na primeira posição de coluna [, 1], e com a contagem de populações observadas, pelos mesmos estratos e posições de coluna do objeto ''df.event''. ~~
 
~~''df.pop.st''	Um data.frame com a contagem de populações padrão com a mesma coluna de identificação e mesma posição de estratos fornecidos no objeto ''df.event''. Se ''df.pop.st'' = NULL, a contagem de populações padrão será a da Organização Mundial da Saúde, com três estratos etários (ver detalhes).~~
 
~~''mult''	Um vetor numérico utilizado como multiplicador para evitar valores fracionados de difícil interpretação. ~~

~~''crude.rt''	Um vetor lógico para apresentação das taxas não ajustadas (brutas). ~~

Details

~~ A coluna de identificação em todos os objetos de entrada pode ser um local, um ano, código de setor, nome de município ou outro. Os eventos observados podem ser casos, óbitos, agravos ou outros. Os estratos podem ser categorias por faixa etária, categorias por sexo ou outros. ~~
~~  No objeto ''df.pop.st'', quando este é nulo (default), a população padrão utilizada como é a da Organização Mundial da Saúde (OMS), que está dividida nos seguintes estratos: segunda coluna correspondente a contagem de 00 a 14 anos de idade; terceira coluna equivalente a contagem de 15 a 59 anos de idade; e quarta coluna referente a contagem de 60 anos e mais de idade.¹ ~~
~~  O método utilizado para a padronização, é o método direto.² ~~

Value

~~ Se ''crude.rt'' = TRUE (defalut), retorna um data.frame, com uma coluna com a mesma identificação fornecida pelo usuário, uma segunda coluna com as taxas padronizadas por pelo método direto e uma terceira coluna com as taxas não ajustadas (brutas).~~

~~ Se ''crude.rt'' = FALSE retorna um data.frame de saída com uma coluna com a mesma identificação fornecida pelo usuário e uma segunda coluna com as taxas padronizadas pelo método direto.~~
 
~~ Se ''mult'' = 100000, os resultados das taxas serão multiplicados por 100 mil habitantes. ~~

~~ Se ''df.pop.st'' = NULL, a população utilizada para a padronização das taxas será a da Organização Mundial da Saúde.~~
 
Warning:

~~ Os objetos de entrada devem:~~
~~ - ser da classe data.frame ~~
~~ - apresentar uma primeira coluna comum de identificação ~~
~~ - apresentar colunas por categorias de estrados comum entre todos os objetos, constando mesma ordem de posição de coluna e com observações numéricas. ~~
~~ - não apresentar valores NAs ou valores zero (este último, exceto para o objeto de entrada ‘df.event’). ~~

Note:

...

References


~~ 1.	National Cancer Institute. World (WHO 2000-2025) Standard. Acesso em: 18 jun 2019. Disponível em <https://seer.cancer.gov/stdpopulations/world.who.html> ~~

~~ 2.	National Cancer Institute. SEER*Stat Tutorials: Calculating Age-adjusted Rates. Acesso em: 18 jun 2019. Disponível em<https://seer.cancer.gov/seerstat/tutorials/aarates/definition.html> ~~


Author

 ~~ Patricia Marques Moralejo Bermudi patricia.bermudi@usp.br~~

See Also

...

Examples

##Exemplo 1
## df.event <- data.frame(cod_local = seq(1:3),
##                       c0_14 = c(3, 200, 500),
##                       c15_60 = c(8, 400, 1090),
##                       c60_em = c(50, 4800, 19200))
## df.pop <-  data.frame(cod_local = seq(1:3),
##                      p00_14 = c(603500, 225957, 150367),
##                      p15_60 = c(272373, 573743, 541965),
##                      p60_em = c(41630, 167600, 107313))
##x <- stRate(df.event, df.pop)
##x 
## A população padrão que está sendo utilizada é a da OMS, conforme consta no HELP 
## ID Taxa Bruta Taxa Padronizada
## 1  1      17.00            43.00
## 2  2     544.09           393.15
## 3  3    1589.58          1430.01

##Exemplo 2
##df.event <- data.frame(cod_local = seq(1:3),
##                       c1 = c(3, 200, 500),
##                       c2 = c(50, 4800, 19200))

##df.pop <-  data.frame(cod_local = seq(1:3),
##                      p1 = c(60350, 22595, 15036),
##                      p2 = c(4163, 16760, 10731))

##df_st <- data.frame(cod_local = seq(1:3),
##                    pp1 = rep(58080, 3),
##                    pp2 = rep(81920, 3))

##y <- stRate(df.event, df.pop, df.pop.st = df_st, mult = 10000, crude.rt = F)

##y

##  ID Taxa Padronizada
##1  1            70.49
##2  2          1712.55
##3  3         10607.38
\end{lstlisting}



\subsubsection{\texorpdfstring{Proposta: Padronização direta de taxas}{Proposta Padronizaao direta de taxas}}
\label{sec:proposta_padronizaao_direta_de_taxas}


\paragraph{\texorpdfstring{CONTEXTUALIZAÇÃO:}{CONTEXTUALIZAAO}}
\label{sec:contextualizaao}


 Comparar taxas sem nenhum ajuste (taxas brutas), entre locais ou entre diferentes períodos de tempo no mesmo local, pode induzir à interpretações errôneas. É necessário considerar que diferentes populações podem apresentar diferentes distribuições de determinantes que estão relacionados ao evento de estudo. Deste modo, a padronização direta de taxas é um método utilizado para retirar esse efeito de confusão, fazendo um ajuste por uma ou mais variáveis presentes na população que estão causando confundimento. 

 Nesta padronização, as populações observadas que serão comparadas (separadas em estratos segundo a variável de interrese) são matematicamente ajustadas para a estrutura de uma população escolhida ('população padrão'). Assim, a medida obtida representa a taxa \footnote{de incidência, prevalência ou mortalidade} de um local, considerando que este teria a mesma distribuição da população adotada como “padrão” em relação a variável escolhida para o ajuste.

 Na área da saúde, é comum realizar a \href{https://seer.cancer.gov/seerstat/tutorials/aarates/definition.html}{padronização pela variável idade} \footnote{dentro do link, clique na última linha, em 'view the steps'} e usar, como população padrão, a estrutura de estratos da \href{https://seer.cancer.gov/stdpopulations/world.who.html}{população elaborada pela da Organização Mundial da Saúde}, que nesta função será agrupada em três estratos (jovens\footnote{0 a 14 anos de idade}, adultos\footnote{15 a 60 anos de idade} e idosos\footnote{60 anos e mais de idade}) e deixada como default.  

Cálculo de uma taxa não ajustada (bruta) ‘crude.rt’:

\includegraphics[keepaspectratio=true,width=0.8\textwidth]{bie5782/01_curso_atual/alunos/trabalho_final/patricia.bermudi/tx_bruta_r}


Cálculo dos eventos esperados de um extrato z 
‘espct\_event’ de um estrato apenas:\includegraphics[keepaspectratio=true,width=0.8\textwidth]{bie5782/01_curso_atual/alunos/trabalho_final/patricia.bermudi/eventos_esperados_r}


Cálculo da taxa padronizada ‘st\_rate’:
\includegraphics[keepaspectratio=true,width=0.8\textwidth]{bie5782/01_curso_atual/alunos/trabalho_final/patricia.bermudi/tx_pad_r}


\paragraph{\texorpdfstring{MINHA FUNÇÃO:}{MINHA FUNAO}}
\label{sec:minha_funao}


\textbf{Título:} stRate (standardised rate). 

\textbf{Entrada:} stRate (\texttt{df.event}, \texttt{df.pop}, \texttt{df.pop.st} = NULL, \texttt{mult} = 100000, \texttt{crude.rt} = TRUE)

\paragraph{\texorpdfstring{ARGUMENTOS:}{ARGUMENTOS}}
\label{sec:argumentos}

\begin{itemize}
  \item \texttt{df.event} Um dataframe com a contagem de eventos observados\footnote{casos, óbitos, agravos ou outros} por estratos\footnote{etários ou outros}, segundo uma variável de identificação.\footnote{local ou ano}
  \item \texttt{df.pop} Um dataframe com a contagem de populações observadas, pelos mesmos estratos e variável de identificação fornecidos no objeto \texttt{df.event}.
  \item \texttt{df.pop.st} Um dataframe com a contagem de populações padrão pelos mesmos estratos e variável de identificação fornecidos no objeto \texttt{df.event}. Se \texttt{df.pop.st} = NULL, a contagem de populações padrão será a da Organização Mundial da Saúde.
  \item \texttt{mult} Um vetor númerico utilizado como multiplicador para evitar valores fracionados de difícil interpretação. Se \texttt{mult} = 100000, os resultados das taxas serão multiplicados por 100 mil habitantes. 
  \item \texttt{crude.rt} Um vetor lógico. Se \texttt{crude.rt} = TRUE, realiza e apresenta o cálculo das taxas não ajustadas (brutas). 
\end{itemize}


\paragraph{\texorpdfstring{CONTROLES DE FLUXO:}{CONTROLES DE FLUXO}}
\label{sec:controles_de_fluxo}

\begin{itemize}
  \item Os objetos de entrada \texttt{df.event}; \texttt{df.pop}; ( e \texttt{df.pop.st}, se for o caso) são da classe data.frame? Se não, a função para e retorna uma mensagem ao usuário para correção.
  \item Os objetos de entrada \texttt{df.event}; \texttt{df.pop}; ( e \texttt{df.pop.st}, se for o caso) contém na posição [1] uma coluna de identificação? Se não, a função para e retorna uma mensagem ao usuário para correção.
  \item Os objetos de entrada \texttt{df.event}; \texttt{df.pop}; ( e \texttt{df.pop.st}, se for o caso) contém nas posições [2] em diante de colunas, variáveis numéricas com as respectivas contagens? Se não, a função para e retorna uma mensagem ao usuário para correção.
  \item Os objetos de entrada \texttt{df.event}; \texttt{df.pop}; ( e \texttt{df.pop.st}, se for o caso) contém o mesmo número de linhas (locais ou ano) e colunas (variáveis)? Se não, a função para e retorna uma mensagem ao usuário para correção. 
  \item Os objetos de entrada \texttt{df.pop}; ( e \texttt{df.pop.st}, se for o caso) contém o valor zero ou NA? Se sim, a função para e retorna uma mensagem ao usuário para correção. 
  \item O usuário respondeu (por meio da função readline) que seus dataframes fornecidos NÃO possuem a mesma sequência em relação aos extratos? Se não, a função para e retorna uma mensagem ao usuário para correção.
  \item O usuário selecionou \texttt{crude.rt} = FALSE? Se sim, a função não realiza o cálculo e não apresenta os valores das taxas não ajustadas (brutas). 
  \item O usuário deixou a opção \texttt{df.pop.st}  = NULL? Se sim, verifica se os objetos de entrada \texttt{df.event}; \texttt{df.pop} contém quatro colunas. Se sim, mostrar uma mensagem que será utilizada a população padrão da OMS. Se não, a função para e retorna uma mensagem ao usuário para correção.
\end{itemize}


\paragraph{\texorpdfstring{PSEUDO-CÓDIGO:}{PSEUDOCODIGO}}
\label{sec:pseudocodigo}

\begin{enumerate}
  \item Aplica uma condição: 

  \begin{enumerate}
    \item Se ‘is.null(\texttt{df.pop.st})’: cria um objeto \texttt{df.pop.st}, da classe 'data.frame' que contém:

      \begin{enumerate}
      \item A primeira coluna de identificação do objeto \texttt{df.cases}
      \item As três demais colunas correspondentes as repetições dos respectivos três valores da população padrão da organização mundial da saúde, com número de linhas equivalente ao objeto \texttt{df.cases}. 
    \end{enumerate}
    \end{enumerate}
  \item Cria um objeto vazio de eventos esperados \texttt{expct\_event}. 

  \begin{enumerate}
    \item Este recebe uma matriz com valores NA e o mesmo número de linhas e colunas do objeto \texttt{df.cases}
  \end{enumerate}
  \item Transforma \texttt{expct\_event} em data.frame
  \item Cria dois ciclos \texttt{for} para preencher \texttt{expct\_event}

  \begin{enumerate}
    \item O primeiro com contador \texttt{i} de 1 até o número de linhas do objeto \texttt{df.cases}
    \item O segundo com contador \texttt{k} de 2 até o número de colunas do objeto \texttt{df.cases}
    \item Atribui ao objeto \texttt{expct\_event} nas posições \texttt{i} e \texttt{k}: 

      \begin{enumerate}
      \item A multiplicação dos eventos observados de \texttt{df.cases} nas posições \texttt{i} e \texttt{k}, pela população padrão \texttt{df.pop.st} nas posições \texttt{i} e \texttt{k}
      \item Dividindo pela população observadas \texttt{df.pop} nas posições \texttt{i} e \texttt{k}.
    \end{enumerate}
    \end{enumerate}
  \item Cria um objeto que recebe a taxa padronizada \texttt{st\_rate}

  \begin{enumerate}
    \item Atribui à um data.frame uma primeira coluna correspondente à coluna de identificação do objeto \texttt{df.cases} e uma segunda coluna com o cálculo da taxa, arredondando para duas casas decimais 

      \begin{enumerate}
      \item Por meio da função \texttt{apply}: faz a somatória, por linhas, de todas as colunas dos eventos esperados \texttt{expct\_event}, exceto a coluna um, que é de identificação. 
      \item Multiplica este valor pelo argumento \texttt{mult}
      \item Divide pela somatória, por meio da função \texttt{apply}, por linhas, de todas as colunas das populações padrão \texttt{df.pop.st}, exceto a coluna um.
    \end{enumerate}
    \end{enumerate}
  \item Aplica uma condição:

  \begin{enumerate}
    \item Se \texttt{crude\_rt} ==  TRUE: cria um objeto\texttt{st\_crude}, da classe data.frame: da taxa não ajustada (bruta), arredondando para duas casas decimais:

      \begin{enumerate}
      \item A primeira coluna recebe a coluna de identificação do objeto \texttt{df.cases}
      \item Por meio da função apply: faz a somatória, por linhas, de todas as colunas dos eventos observados \texttt{df.event}, exceto a coluna um, que é de identificação
      \item Multiplica este valor pelo argumento \texttt{mult}
      \item Divide pela somatória, por meio da função \texttt{apply}, por linhas, de todas as colunas das populações observadas \texttt{df.pop}, exceto a coluna um.
      \item Cria um objeto \texttt{exit}

          \begin{enumerate}
        \item Faz a combinação por colunas das taxas padronizadas \texttt{st\_rate} e com as taxas brutas \texttt{st\_crude}, esta última sem a coluna de identificação
        \item Renomeia os nomes das colunas para “ID,,, ,,Taxa padronizada", ,,Taxa bruta")
      \end{enumerate}
      \end{enumerate}
    \item Se não: 

      \begin{enumerate}
        \item Cria um objeto \texttt{exit} apenas com as taxas padronizadas \texttt{st\_rate}
        \item Renomeia os nomes das colunas para “ID" e ,,Taxa padronizada"
      \end{enumerate}
      \end{enumerate}
  \item Retorna \texttt{exit}
\end{enumerate}


\paragraph{\texorpdfstring{SAÍDA:}{SAIDA}}
\label{sec:saida}

\begin{itemize}
  \item Data.frame com o mesmo número de linhas e mesma coluna de identificação do objeto de entrada \texttt{df.event}, com uma coluna referente as taxas padronizadas e, se escolhido pelo usuário, com uma coluna referente as taxas brutas.
\end{itemize}


\paragraph{\texorpdfstring{GENERALIDADE NO USO DA FUNÇÃO:}{GENERALIDADE NO USO DA FUNAO}}
\label{sec:generalidade_no_uso_da_funao}

\begin{itemize}
  \item O usuário insere a variável de evento desejada. Não há limite para o número de linhas. Desde modo, a função se aplica a:

  \begin{itemize}
    \item Qualquer agravo ou doença escolhido pelo usuário
    \item Qualquer e quantas localidades (ou períodos de tempo)  escolhidos 
  \end{itemize}
  \item A função também foi pensada para não limitar o número de colunas. Além disso, possibilita inserir um dataframe com a população padrão da escolha do usuário. Assim: 

  \begin{itemize}
    \item É possível padronizar por idade por quantos estratos de faixa etárias forem necessários
    \item Também é possível utilizar este método para ajuste com outras variáveis como, por exemplo, ajuste por sexo \footnote{Basta o usuário inserir os objetos nos argumentos correspondentes aos data.frames: \texttt{df.event}, \texttt{df.pop} e  \texttt{df.st}, cada um contendo uma coluna de identificação e uma coluna de contagem para cada estrato (sexo masculino e sexo feminino). } 
  \end{itemize}
  \end{itemize}
 Comentários Lucas Camacho
Oi Patricia, tudo bem?

Sua proposta está super completa e bem estruturada. Acho que você estudou bem como fazer ela e gostei bastante do tópico sobre generalização da função e como dá pra usar elas em outros contextos.

Enfim, acho legal você tentar entregar ela. Resposta Patricia
Oi Lucas, muito obrigada! Ficarei com a proposta A. 

Te mandei um e-mail com uma dúvida.

Grata! Abraços

\subsubsection{\texorpdfstring{Plano B: Função para média móvel}{Plano B Funao para media movel}}
\label{sec:plano_b_funao_para_media_movel}


\paragraph{\texorpdfstring{CONTEXTUALIZAÇÃO:}{CONTEXTUALIZAAO}}
\label{sec:contextualizaao2}


 A média móvel simples tem o objetivo de suavizar uma tendência de um conjunto de dados que apresenta flutuação aleatória ao longo do tempo. Seu cálculo é dado por meio de média aritmética, comumente realizada a cada três valores. Assim, esta se inicia na posição um e vai se descolando até o final, ao longo do conjunto de dados, de uma em uma unidade de período de tempo (dias, meses, ano, etc). \href{https://www.tororadar.com.br/investimento/analise-tecnica/medias-moveis}{ Exemplo}

\paragraph{\texorpdfstring{MINHA FUNÇÃO:}{MINHA FUNAO}}
\label{sec:minha_funao2}


\textbf{Título:} movMean (Moving mean).

\textbf{Entrada:} movMean(\texttt{data}, \texttt{period}, \texttt{k} = 3)

\paragraph{\texorpdfstring{ARGUMENTOS:}{ARGUMENTOS}}
\label{sec:argumentos2}

      \begin{itemize}
  \item \texttt{data} Um vetor numérico quantitativo
  \item \texttt{period}Um vetor numérico quantitativo correspondente ao período de cada valor em ‘data’
  \item \texttt{k} Um valor correspondente a quantidade de valores em ‘data’ que serão contabilizados para a média móvel em cada deslocamento  
\end{itemize}


\paragraph{\texorpdfstring{CONTROLES DE FLUXO:}{CONTROLES DE FLUXO}}
\label{sec:controles_de_fluxo2}

\begin{itemize}
  \item Os objetos de entrada \texttt{data} e \texttt{period} são numéricos? Se não, a função para e retorna uma mensagem de erro.
  \item Os objetos de entrada \texttt{data} e \texttt{period} possuem o mesmo tamanho? Se não, a função para e retorna uma mensagem de erro.
  \item O objeto \texttt{data} possui NA? Se sim, a função para e retorna uma mensagem de erro.
\end{itemize}


\paragraph{\texorpdfstring{PSEUDO-CÓDIGO:}{PSEUDOCODIGO}}
\label{sec:pseudocodigo2}

\begin{enumerate}
  \item Cria um objeto vazio para receber as médias móveis

  \begin{enumerate}
    \item Atribui a um objeto \texttt{mm} repetições de NA com tamanho correspondente a variável \texttt{data} subtraindo o valor dois, já que a primeira e última posição não serão ocupadas.
  \end{enumerate}
  \item Cria um objeto \texttt{j} com atribuição de \texttt{k}
  \item Cria um ciclo \texttt{For} com contador \texttt{i} indo de 1 até o tamanho da variável \texttt{data} menos dois

  \begin{enumerate}
    \item Atribui ao objeto \texttt{mm} na posição \texttt{i} a soma de \texttt{data} nas posições de \texttt{i} a \texttt{j}, dividindo por \texttt{k}
    \item Atribui ao objeto \texttt{j}, a operação \texttt{j} + 1
  \end{enumerate}
  \item Faz o plot de um gráfico de linhas do objeto \texttt{data}e do objeto das médias móveis \texttt{mm}
  \item Sobrescreve o vetor \texttt{mm} acrescentando NA na primeira e última posição, para que o vetor tenho o mesmo tamanho dos demais vetores
  \item Cria um objeto \texttt{exit} contendo um dataframe com os valores dos períodos \texttt{period}, do vetor \texttt{data} e das médias móveis \texttt{mm}. 
  \item Retorna \texttt{exist} 
\end{enumerate}


\paragraph{\texorpdfstring{SAÍDA:}{SAIDA}}
\label{sec:saida2}

\begin{itemize}
  \item Gráfico de linhas de comparação dos valores observados e dos valores estimados. 
  \item Data frame com os vetores fornecidos pelos usuários e os valores das médias móveis. 
\end{itemize}


\paragraph{\texorpdfstring{GENERALIDADE NO USO DA FUNÇÃO:}{GENERALIDADE NO USO DA FUNAO}}
\label{sec:generalidade_no_uso_da_funao2}

\begin{itemize}
  \item A função pode calcular a média móvel para qualquer evento de interesse. 
  \item Alterando o valor do argumento \texttt{k}: a função pode realizar médias de diferentes tamanhos de períodos de tempo. Exemplo, com \texttt{k} = 4 e com unidade de medida do argumento \texttt{period} em ano, serão calculadas médias móveis quadrienais. 
  \item Ao retornar um dataframe, o usuário pode obter os dados das médias para fazer outros tipos de gráficos de sua escolha. 
\end{itemize}
 Comentários Lucas Camacho
Essa função também está bem estruturada e parece um pouco mais simples do que a proposta A.

Patricia, ambas as propostas estão boas e acho que você pode escolher qual das duas você quer entregar como trabalho final. 

Qualquer dúvida que você tiver pode me mandar e-mail (lucas.camacho@usp.br) e podemos conversar.

Abraços

\end{document}
