Tutorial: Lidando com Missing no SAS

Já falei sobre missing em alguns posts aqui (ver post Verificar se alguma das colunas é missing no SAS e Formas de deletar linhas com Missing no SAS), mesmo assim, notei que faltaram algumas coisas. Este post é para dar conta do que não foi abordado no assunto. Ou seja, pode considerar o TUTORIAL como sendo a soma destes 3 posts.

FORMA MAIS USUAL DE LOCALIZAR/MARCAR MISSING

A forma mais comum que você vai ver as pessoas utilizando tentando verificar se uma variável é missing ou não é com o uso de aspas (simples ou dupla) para campos tipo texto ou o ponto para campos numéricos.

Abaixo, verifica-se se o campo x, que tem formato texto, é missing. Caso x seja missing, o campo fl_missing recebe 1. Caso não seja, fl_missing recebe 0.

if x = "" then fl_missing = 1;
else fl_missing = 0;

Abaixo, verifica-se se o campo y, que tem formato numérico, é missing. Caso y seja missing, o campo fl_missing recebe 1. Caso não seja, fl_missing recebe 0.

if y = . then fl_missing = 1;
else fl_missing = 0;

O QUE É CONSIDERADO MISSING E A FUNÇÃO MISSING()

Antes de mais nada, na dúvida, é possível usar a função missing() para detectar se o campo é missing ou não. Como se trata de uma função lógica, o retorno dela é 1 para o caso de campo ser missing ou 0, caso negativo. Como de costume, vamos começar criando uma tabela para servir de exemplo:

data tabela_exemplo;
    input id $ valor;
    cards ;
AA111 150
BB222 .
CC333 _
DD444 300
"" 1000
AA555 ""
. 150
;
run;

Note que temos dois casos em que o campo id, de formato texto, teve um preenchimento inusitado (com aspas e ponto); e três casos em que o campo valor, numérico, contém três preenchimentos atípitcos (com ponto, underline e aspas). Para verificar se estes campos são considerados missing pelo SAS, vamos criar uma coluna chamada missing_id para verificar se o id é missing e, analogamente, uma chamada missing_valor para verificar se o valor é missing:

data verifica_missing;
    set tabela_exemplo;
    missing_id = missing(id);
    missing_valor = missing(valor);
run;

Como podemos ver, para campos texto, o preenchimento com aspas faz com que o campo não seja missing. No entanto, quando temos preenchimento com um ponto, estes campos são considerados missing. No caso dos numéricos, o prenchimento com ponto, underline e até mesmo as aspas não são considerados preenchimento. Portanto, a função retorna que a variável é missing ali.

Importante notar ainda que, para campos numéricos, ao iniciarmos o preenchimento com um aspas ou underline, ou preenchermos o campo com uma letra, o campo é considerado missing. Veja o exemplo abaixo:

data tabela_exemplo_2;
    input id $ valor;
    cards ;
AA111 150
BB222 _500
CC333 100
DD444 300
AA555 ""100
.AABBB AAA
;
run ;

data verifica_missing;
    set tabela_exemplo_2;
    missing_id = missing(id);
    missing_valor = missing(valor);
run;

É possível verificar a quantidade de missing através do PROC FREQ, para variáveis texto, e PROC MEANS para variáveis numéricas.

data tabela_exemplo;
    input id $ valor;
    cards ;
AA111 150
BB222 .
CC333 _
DD444 300
"" 1000
AA555 ""
. 150
;
run ;

proc means data =tabela_exemplo nmiss ;
    var valor;
run;

proc freq data =tabela_exemplo;
    table id;
run;

Veja que o PROC FREQ pode ser um problema para casos em que temos muitos campos diferentes. Minha recomendação é utilizar o nosso primeiro exemplo em que criamos a tabela verifica_missing e fazer a soma da coluna missing_id. Para não causar confusão, abaixo temos todos os passos desde a construção da tabela exemplo:

data tabela_exemplo;
    input id $ valor;
    cards ;
AA111 150
BB222 .
CC333 _
DD444 300
"" 1000
AA555 ""
. 150
;
run ;

data verifica_missing;
    set tabela_exemplo;
    missing_id = missing(id);
    missing_valor = missing(valor);
run;

proc sql ;
    select sum(missing_id) as qtd_missing_id
    from verifica_missing;
run;

ATENÇÃO: Não execute o proc freq para campos numéricos, pois é quase certo que seu SAS vai travar. No caso do PROC MEANS para variáveis numéricas, o código simplesmente não irá funcionar.

E se quiser saber a quantidade de não missing no PROC MEANS, acrescente o N:

proc means data =tabela_exemplo n nmiss ;
var valor;
run ;

FUNÇÃO NMISS()

A função nmiss() retorna o número de missings em determinada linha (grupo de variáveis). No exemplo abaixo, primeiro criamos uma tabela e, em seguida, criamos uma variável com a quantidade de missings de todas as colunas e com a quantidade de missings das colunas A e B:

data tabela_exemplo;
    input A $ B C D $;
    cards ;
A 10 20 AA
B 30 . BB
. 10 . CC
D . . .
;
run ;

data nmiss_exemplo;
    set tabela_exemplo;
    nmiss_todas = nmiss(A,B,C,D);
    nmiss_AB = nmiss(A,B);
run;

SOMA ENTRE CAMPOS MISSING E NÃO MISSING

O SAS é bastante “maleável” no que diz respeito a lidar com alguns problemas e assumir premissas que facilitem a vida do usuário. Porém, essa maleabilidade pode enganar as pessoas na hora de trabalhar com campos numéricos que contenham missing. Para realizar operações entre diferentes colunas, em que uma tem missing e outra não tem, quando você utilizar as funções do SAS, ele vai realizar os cálculos com os campos não missing e ignorar os demais. Porém, quando você fizer operações aritméticas com os campos, ele irá sempre retornar missing, se houver algum missing envolvido na operação. Veja um exemplo:

data tabela_exemplo;
    input A B C;
    cards ;
10 20 30
5 . 2
10 10 .
;
run ;

data exemplo_soma_e_media;
    set tabela_exemplo;

    soma = sum(A,B,C);
    soma2 = A+B+C;

    media = mean(A,B,C);
    media2 = (A+B+C)/3;

run;

Creio que isso seja o essencial para lidar com missing no SAS. Não se esqueça de também consultar os outros dois posts mencionados no início deste post.

Espero que tenha aproveitado e aprendido algo novo. Não se esqueça de seguir o EstatSite no Twitter, @EstatSite. Se você gostou do post, deixe uma curtida ou comentário. Se tiver dúvidas, fique a vontade para deixar um comentário ou me escrever através do formulário em Sobre o Estatsite.

Bons estudos!

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *