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 variáveis dummy no SAS

Há algumas formas simples de criar uma variável dummy no SAS, vou demonstrar duas que eu utilizo constantemente.

Primeiramente, apenas para relembrar, uma variável dummy é um artifício criado para representar uma característica do indivíduo da amostra. Podemos criar uma variável dummy do sexo por exemplo, que receberá 1 se o indivíduo for mulher e 0 se for homem. Ou então criar uma dummy para reprovação, onde o aluno recebe 1 caso tenha sido reprovado e 0 caso tenha sido aprovado.

Isso serve para incluir informações não numéricas nas regressões, ou informações numéricas que não representam quantidades. Por exemplo, se eu tiver sala 1 e sala 2 de aula em uma regressão, qualquer operação aritmética com os números da sala não vai fazer sentido. Seria idêntico ter sala A e B.

No post Como calcular a diferença entre duas datas no SAS? criei a tabela turma_1. Vamos utilizá-la para criar duas novas variáveis, aprovacao_1 e aprovacao_2. Essas variáveis vão atribuir 1 ao aluno aprovado, no caso, a aprovação ocorre caso o aluno tenha nota maior ou igual a 6. Caso o aluno não tenha nota suficiente para aprovação, a dummy criada receberá 0:

data turma_1_1;
    set turma_1;
    aprovacao_1 = notas >= 6;
    if notas >= 6 then aprovacao_2 = 1;
    else aprovacao_2 = 0;
run;

Veja que com essa nova variável poderíamos fazer regressões para estudar o que afeta a reprovação de um aluno, ou até mesmo se a reprovação afeta algo.

Simples, não?

Qualquer dúvida, sugestão ou crítica é só comentar abaixo!

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!

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”

Média Móvel: Explicação, Comando SAS e Função LAG

A maioria das pessoas conhece e utiliza a média no dia a dia. O que alguns não conhecem é a média móvel. O que seria isso?

A média móvel nada mais é do que a média de um determinado número de observações recentes. Por exemplo, suponha que você seja dono de uma oficina e venda peças para automóveis. Suas vendas trimestrais estão representadas pela tabela abaixo:

Você é cauteloso com o seu orçamento, e, para decidir quanto gastar no ano seguinte, você quer verificar a tendência das vendas. Uma alternativa é utilizar a média móvel trimestral, que seria nada mais do que a média dos últimos três meses. Ou seja, você irá sempre pegar a média dos últimos três meses. Isso é útil para verificar se está havendo uma tendência de crescimento ou uma reversão, pois você captura movimentos recentes de vendas:

Simples, não?

Bônus – Média Móvel no SAS:

Para calcular a média móvel no SAS você precisará de algo que identifique os meses anteriores ao que você está analisando, isso pode ser obtido com a função lag().

Vamos supor que a tabela do exemplo acima foi criada no SAS com o nome BASE_VENDAS, contendo as variáveis: Ano e Vendas. Ao utilizar LAG(vendas), obteremos a variável vendas com uma defasagem. Ao utilizar LAG2(vendas), obteremos a variável vendas com duas defasagens:

data Variaveis_Defasadas;
    set Base_Vendas;
    Vendas_M1 = lag(vendas);
    Vendas_M2 = lag2(vendas);
run;

Esse é o resultado:


Agora ficou fácil descobrir como chegar a média móvel, certo?

data Media_Movel;
    set Variaveis_Defasadas;
    Media_3M = SUM(Vendas,Vendas_M1,Vendas_M2)/3;
    DROP Vendas_M1 Vendas_M2;
run;

Simples não?

Apenas para sanar quaisquer dúvidas:

SUM = Soma as variáveis, utilizando a vírgula para separá-las.

DROP = Exclui da tabela as variáveis (as colunas) que você não precisa mais.