Utilizando datas dentro do seu script no SAS

Já falei de como trabalhar com datas no SAS em posts antigos, como em Formatando Datas no SAS. No entanto, nem sempre queremos trabalhar só com as datas que já estão nos nossos dados. Vamos supor que a gente queira trabalhar apenas com os alunos nascidos a partir de 31/01/1999 dos dados no post Como calcular a diferença entre duas datas no SAS?

Se você quiser pegar as informações cuja data é maior que 31/01/1999, os exemplos abaixo não funcionarão:

  1. if dt_nasc < “1999-01-31”;
  2. if dt_nasc < “31/01/1999”;

O SAS não vai entender que o que está à direita é uma data, para ele é um texto qualquer. Para trabalhar com essa data você precisaria utilizar as iniciais do mês e um d após o fechamento das aspas. No nosso exemplo, o que funcionaria seria:

if dt_nasc > "31jan1999"d;

Lembre-se que você deve colocar as iniciais do mês em inglês. Ou seja, para setembro, use “31sep2015″d ao invés de “31set2015″d!

Criando classes / categorias no SAS

Já expliquei no post Percentil – Conceito e Código SAS o que é percentil e como obtê-lo no SAS. Agora, uma coisa que é interessante, e eu precisei usar recentemente, é criar classes no SAS. Há uma forma bem direta de fazer isso através do proc rank. Porém, já havia um código mais “roots” para fazer isso e acho legal compartilhar. É interessante ver alternativas ao que já está preparado (outros softwares podem não ter o comando).

Para demonstrar melhor como criar classes, eu aumentei minha base de dados contendo as alturas dos indivíduos de uma amostra. Para não confundir com a tabela AMOSTRA, eu criei uma nova tabela chamada POPULACAO, contendo 60 alturas. O que vamos fazer no exemplo é criar uma coluna adicional na tabela com as letras de A a J indicando a qual percentil a altura do indivíduo pertence. Isso pode ser útil para obter dummies para regressões e até mesmo para tomar estatística descritiva dos indivíduos, e desse jeito é mais fácil do que utilizando o IF.

Para obter as classes, há dois passos:

  • Primeiro você deve obter o valor de cada percentil, nesse exemplo, comecei do 10° percentil e utilizei intervalos de 10 em 10, mas você pode dividir como for melhor para sua análise:
proc univariate data= work.populacao;
    var altura; output OUT=work.altura 
       pctlpre=p_altura_ pctlpts= 10 to 100 by 10;
run;
  • Agora, vou utilizar o CASE WHEN, que é uma função para lidar com condições no SAS. Veja abaixo que a gente inicia o código com o proc sql seguido de ponto e vírgula como sempre, até aí nenhuma novidade. Em seguida ‘dizemos’ para o SAS criar uma tabela (create table) com o nome populacao_classes na nossa work. Como nós queremos gerar essa nossa nova base a partir da base populacao criada anteriormente, é preciso dizer ao SAS quais campos ele deve trazer da base original. O asterisco após o select indica que o SAS vai trazer todos os campos da base de origem, que no caso é a tabela populacao que está na work. Em seguida vem o case when, que dá o comando ao SAS para atribuir uma letra caso a altura do indivíduo esteja no percentil em questão:
proc sql;
    create table populacao_classes as select *,

      case
      when altura <= (select p_altura_10 from work.altura) then 'A'
      when altura <= (select p_altura_20 from work.altura) then 'B'
      when altura <= (select p_altura_30 from work.altura) then 'C'
      when altura <= (select p_altura_40 from work.altura) then 'D'
      when altura <= (select p_altura_50 from work.altura) then 'E'
      when altura <= (select p_altura_60 from work.altura) then 'F'
      when altura <= (select p_altura_70 from work.altura) then 'G'
      when altura <= (select p_altura_80 from work.altura) then 'H'
      when altura <= (select p_altura_90 from work.altura) then 'I'
      when altura <= (select p_altura_100 from work.altura) then 'J'
      else 'outros'
    end AS classe_altura

    from work.populacao;
proc print;
run;

Para os que ainda estão com dúvidas, segue uma imagem para facilitar o entendimento (veja que as bases na imagem abaixo vão até a linha 25, e não até a linha 60 que é a última linha):

Intervalo de Confiança: o que é e como estimar no SAS?

Intervalo de confiança nada mais é do que uma estimativa de um parâmetro de uma população.

Lembra de quando falamos de inferência estatística no post Estatística, Estatística Descritiva, Inferência Estatística?

Você tem uma amostra de uma população (um subgrupo) e a partir dela faz inferências a respeito da população. Os intervalos de confiança fazem isso para os parâmetros dessa população, eles inferem os valores reais e consideram um determinado grau de incerteza. Você vai conseguir, a partir de um parâmetro do seu subgrupo, estimar um parâmetro da população inteira.

Por exemplo, vamos supor que você tenha uma população de 100 milhões de pessoas e quer saber a altura média dessa população. Porém, para saber com certeza qual é a altura média da população inteira, você teria que medir todas as 100 milhões de pessoas, o que é praticamente impossível. Então, o que você faz?

Você pega uma amostra dessa população, de por exemplo 1.000 habitantes e calcula a altura delas. Você vai querer inferir a partir da altura média desses 1.000 habitantes, a altura média da sua população. Ou seja, você quer pegar essas 1.000 pessoas e com base nas informações delas, descobrir uma informação da população inteira de 100 milhões de pessoas.

Mas você sabe que a altura média das pessoas da amostra não vai ser exatamente a altura média da população, mas provavelmente algum valor próximo disso. Aí que entra o intervalo de confiança, ele é o intervalo no qual a altura da sua população estará contida, dado um grau de incerteza.

Se você chegar a conclusão que a altura da sua população está no intervalo de 1,70m a 1,75m com 95% de confiança, você quer dizer que se você coletar 100 amostras dessa população, 95 delas terão altura média no intervalo de 1,70m a 1,75m.

Simples, não?

E como calcular o intervalo de confiança no SAS?

Vejamos a amostra a seguir de uma população:

data amostra;
input altura;
cards;
1.70
1.68
1.80
1.72
1.55
1.66
1.78
1.90
2.00
1.57
2.70
1.78
1.59
1.54
1.53
1.70
;

proc print;
    var altura;
run;

Para calcular a média dessa população basta utilizar o proc summary com os parâmetros alpha, que será 1-nível de confiança, clm (confidence limits on the mean) e var seguido da variável em questão:

proc summary data=amostra print alpha=0.05 clm;
    var altura;
run;

Aqui temos um outro método que produz os mesmos resultados, porém com outros resultados que falaremos em futuros posts:

proc ttest data=amostra alpha=0.05; var altura; run;
Veja que o nosso exemplo o intervalo de confiança é relativamente amplo, ele é de 1,61 a 1,91. Isso parece bem intuitivo, afinal, temos poucas pessoas na amostra e um nível de confiança alto, seria como se nós estivéssemos querendo ter bastante certeza de que a média da população vai estar nesse intervalo. Parece razoável pensar que com poucas pessoas fica mais difícil ser preciso e como queremos ser bastante precisos (95%), só com um intervalo grande para “acertar” a média.

Acompanhando o processo no SAS utilizando o Sysecho

Algumas pessoas escrevem programas grandes, ou demorados, no SAS e colocam para rodar tudo que está dentro de uma vez só. Esses programas podem ter vários data step ou ‘procs’, e é sempre interessante saber em qual etapa exatamente o SAS está. Para isso nós temos o sysecho.

É bem simples, após escrever seu data step ou proc, você inclui o sysecho seguido por um texto (a sua escolha) entre aspas descrevendo o que está sendo executado. Veja o exemplo abaixo:

data base_1;
    sysecho "Cria a variavel coluna_nova";
    set base_de_dados;
    coluna_nova = coluna_1 + coluna_2;
run;

proc sql;
    sysecho "Une com a base 2";
    create table base_2 as
    select a.*,b.*
    from base_1 as a
    left join base_nova as b
    on a.coluna_1 = b.coluna_1;
run;

data base_3;
    sysecho "Cria variavel coluna_x";
    set base_2;
    if coluna_1 > 0 then coluna_x = 'positivo';
    else if coluna_1 = 0 then coluna_x = 'nulo';
    else if coluna_1 < 0 then coluna_x = 'negativ;
    else coluna_x = 'missing';
run;

Veja que fácil agora. Quando você apertar o F3 e deixar esse código rodando, você saberá exatamente em que trecho do programa o SAS está, basta olhar no canto inferior esquerdo que você verá o nome que está ao lado do sysecho do data ou proc em execução!

Como calcular a diferença entre duas datas no SAS?

Novamente vou falar de datas no SAS. É sempre mais difícil trabalhar com datas em qualquer linguagem de programação. Por isso sempre que eu lembro de algo a respeito disso eu trato de escrever aqui porque acho que pode ajudar alguém. Dessa vez vamos aprender como descobrir a distância entre duas datas de algumas formas diferentes.

Voltando ao nosso exemplo dos alunos, nós já tínhamos suas notas e número de faltas, agora vamos acrescentar a data de nascimento deles:

data turma_1;
 input notas faltas dt_nasc ddmmyy10.; 
 format dt_nasc date9.; 
 datalines;
 3.6 13 20/02/1999
 3.6 15 15/04/1999
 5 9 02/10/1999
 6.4 8 01/05/1999
 6.6 7 10/03/1999
 6.6 8 12/11/1998
 6.8 8 14/08/1999
 7.5 5 23/02/1999
 8 4 30/07/1999
 8.7 3 08/03/1999
 9 1 24/02/1999
 9.5 1 15/11/1999
 ;
 proc print;
 run;

Veja como calcular a diferença entre as datas, primeiro de uma forma bem intuitiva apenas com a subtração entre a data de hoje e a do nascimento. Em seguida com as funções datdif e yrdif.

/*Acrescentando as colunas com diferença entre as datas*/
data Turma_1_v1;
    set Turma_1;
    dif_Dias=today()-dt_nasc;
    dif_Dias_2=datdif(dt_nasc,today(),'act/act');
    dif_Dias_3=datdif(dt_nasc,today(),'30/360');
    idade=yrdif(dt_nasc,TODAY());
run;

Como vocês podem ver, foram criados 3 campos utilizando fórmulas diferentes:

  1. Dif_Dias = Diferença entre o dia de hoje e a data de nascimento em dias;
  2. Dif_Dias2 = Diferença entre o dia de hoje e a data de nascimento em dias, utilizando o parâmetro ‘act/act’ para que o SAS entenda que a gente quer que o cálculo considere os dias reais entre as duas datas, considerando o número de dias que cada mês tem de acordo com o calendário;
  3. Dif_Dias3 = Diferença entre o dia de hoje e a data de nascimento em dias, utilizando como padrão que cada mês tem 30 dias e cada ano 360 dias. Isso pode ser útil para pessoas da área de finanças que precisam calcular retorno de alguns títulos;
  4. Idade = Diferença entre o dia de hoje e a data de nascimento em anos. Como não especificamos nada no terceiro parâmetro, o SAS nos traz a diferença considerando o calendário. O mesmo método utilizado em dif_dias poderia ter sido utilizado aqui.

Agora, ficou bem ruim essa idade com várias casas decimais. Eu recomendo trocar aquela linha por esse código com a função round:

idade=round(yrdif(dt_nasc,today()));

Função INTCK

Essa é mais uma função do SAS para lidar com datas, veja só como é intuitiva:

data Turma_1_v2;
set Turma_1;
    dif_meses=intck('month',dt_nasc,today());
    dif_anos=intck('year',dt_nasc,today());
    dif_dias=intck('day',dt_nasc,today());
    dif_semestres=intck('semiyear',dt_nasc,today());
    dif_trimestres=intck('qtr',dt_nasc,today());
run;

Nota: Se você estiver comparando duas datas do mesmo ano, dif_anos retornará zero. O mesmo vale para os demais. Caso você se confunda e coloque a data mais recente antes da data mais antiga, você receberá valores negativos (o que é intuitivo mas vale lembrar).

Gostou do post? Por favor, não vá embora sem deixar uma curtida ou um comentário. Parece algo bobo, mas é um feedback bastante importante para este trabalho. Se encontrou algum erro ou tem alguma sugestão, dúvida, elogio ou crítica, pode escrever nos comentários ou me enviar uma mensagem diretamente em Sobre o Estatsite. E visite também a conta do Twitter @EstatSite.

Forte abraço e bons estudos!

Visualizando seus dados: Gráficos de Dispersão

Outra forma de fazer uma primeira análise dos seus dados é plotar um gráfico de dispersão.

Um gráfico de dispersão é uma representação dos seus dados em eixos onde um valor está em função de outro. Normalmente, esses gráficos possuem dois eixos, um eixo horizontal (eixo x) e um eixo vertical (eixo y) onde cada eixo serve como referência para cada um dos valores do seu par.

Vamos ver na prática como funciona!

Tomando os mesmos dados que tínhamos das notas dos alunos utilizadas no post sobre histogramas, vamos agora verificar a relação entre o número de faltas dos alunos e suas notas:

Agora, queremos ter uma ideia de como essas variáveis se relacionam. Talvez a gente consiga ter uma ideia do comportamento, afinal, é provável que quem falte mais tenha piores notas. Poderemos ver isso com o gráfico de dispersão. Vejamos as diferentes formas de se gerar esse tipo de gráfico utilizando o SAS:

SYMBOL1 V=circle C=black I=none;
TITLE 'Notas x Faltas 1';
PROC GPLOT DATA=auto;
 PLOT Notas*Faltas;
RUN;

 

SYMBOL1 V=circle C=blue I=r;
TITLE 'Notas x Faltas 2';
PROC GPLOT DATA=auto;
 PLOT Notas*Faltas;
RUN;
QUIT;

Como vocês podem notar, SYMBOL é responsável por especificar as características do seu gráfico, sendo que V define o formato, no meu caso usei círculos, mas poderia ser Plus (+), Dot (•), dentre muitos outros. C define a cor e I o que chamamos de interpol nos traz a reta da regressão. Experimente modificar essas características no seu gráfico!

Quando se trabalha com gráfico de dispersão, fica mais claro a correlação entre as duas variáveis em questão. Você vai ver que por si só, esse gráfico já será muito útil na vida profissional e acadêmica. E claro, se você quiser ir além, esse gráfico é um começo para suas análises e regressões!

Visualizando seus dados: Histograma

Um histograma nada mais é do que uma forma de representar seus dados utilizando um gráfico de barras onde o eixo y representa a frequência e o eixo x os intervalos (chamados também de classes) dos seus dados. Simples assim. E já para dar uma ideia antes mesmo das definições mais formais, veja esse exemplo de um conjunto de dados e um histograma executado automaticamente pelo excel (veja o passo a passo no Canal da Educação):

Só de bater o olho, acho que a maioria já consegue entender o que o histograma apresenta. Ele nos dá uma ideia de como nossos dados estão distribuídos, mas para isso ele separa nossos dados em classes, ou, como o excel chamou, em blocos. Veja o que o excel fez, ele separou nossos dados em 5 intervalos:

Menor ou igual a 1, maior que 1 e menor ou igual a 25, maior que 25 e menor ou igual a 49, maior que 49 e menor ou igual a 73 e um último intervalo como sendo os números acima de 73. Para cada intervalo, ele contou o número de elementos dos nossos dados que fazem parte do intervalo em questão e a partir daí fez o gráfico de barras.

Quantos números do nosso conjunto de dados são menores ou iguais a 1? Apenas 1. Quantos são maiores que 1 e menor ou igual a 25? Apenas 6.

Eu não sou fã desse histograma do excel por achar pouco intuitivo os pontos 1, 25, 49, 73 e “Mais” estarem localizados no meio da barra mas não serem o ponto médio do intervalo. É bom se atentar a isso. Mas, deixando a crítica de lado e voltando ao assunto…

Nesse gráfico, o excel nos devolveu o resultado em termos da frequência absoluta, que nada mais é que o número de vezes em que determinado dado aparece. O histograma também pode ser construído com base na frequência relativa, que é o número de vezes em que determinado dado aparece dividido pelo número de elementos da nossa amostra ou população. Em outras palavras, é a representação percentual. Veja esse exemplo com os mesmos dados, mas utilizando a frequência relativa:

E NO SAS? COMO FAZEMOS UM HISTOGRAMA

A forma mais rápida que eu conheço é pelo proc univariate, é bem simples. Basta acrescentar histogram logo após você selecionar as variáveis que deseja visualizar o histograma. No exemplo abaixo, vamos inserir através do Datalines a data e o índice Ibovespa (índice na abertura, alta, baixa, etc.) e em seguida utilizamos o proc univariate para gerar o histograma:

data dados;
    input notas; 
    datalines;
    3.6
    3.6
    5
    6.4
    6.6
    6.6
    6.8
    7.5
    8
    8.7
    9
    9.5
    ;
proc print;
run;

proc univariate data = dados;
    var notas;
    histogram;
run;

Veja que o SAS criou seus intervalos também.

E se eu quiser alterar a forma como as classes estão divididas?

Bom, nesse caso podemos usar tanto o endpoints como o midpoints e escolher o intervalo inferior de todas as classes, o superior, e qual tamanho de cada classe. Veja esse exemplo com midpoints e tente brincar depois com endpoints:

proc univariate data = dados;
     var notas;
     histogram / midpoints=(3 to 10 by 2) ;
run;

Como formatar datas no SAS

E aqui estamos mais uma vez para aprender como deixar nossos datasets melhor formatados. Dessa vez, falaremos de um problema recorrente em qualquer linguagem: datas. Como este campo pode vir em formato numérico ou texto, as pessoas tendem a ter problemas com operações  ou até quando traçam gráficos utilizando eles. Sendo assim, hoje vamos aprender como formatar datas no SAS. Continuar a ler “Como formatar datas no SAS”