Por que algumas pessoas usam -999 ou -9999 para substituir os valores ausentes?

32

Eu tenho um conjunto de dados. Existem muitos valores ausentes. Para algumas colunas, o valor ausente foi substituído por -999, mas em outras colunas, o valor ausente foi marcado como 'NA'.

Por que usaríamos -999 para substituir o valor ausente?

qqqwww
fonte
1
Eu nunca vi -999 eu mesmo. Até agora, vi cordas vazias e NAs.
Ye Tian
12
Porque eles querem atrapalhar terrivelmente os resultados para pessoas que fazem análises superficiais e não leem a documentação com atenção! (Sendo embora séria, @Stephan Kolassa tem a resposta real.)
Matthew Gunn
1
Pergunte à pessoa que forneceu o conjunto de dados ...?
BlueRaja - Danny Pflughoeft
Melhor ainda, são 999 valores nas colunas de medição para indicar que a medida não se aplica ... pelo menos um -999 ou um 0 teria o significado semântico de que não é um valor válido / importante. 999 é apenas o pior.
Adam Martin
Sinto que li uma vez que essa era uma convenção dos dias de gravação de dados em cartões perfurados. Nocautear uma linha completa de 9s tornou os dados ausentes claramente visíveis ao olhar para o cartão, pois era literalmente uma "linha ausente". Não consigo encontrar uma referência para fazer o backup, então deixarei como comentário.
Lucas

Respostas:

65

Este é um destaque de épocas anteriores, quando o software de computador armazenava vetores numéricos como vetores numéricos. Nenhum número real tem a semântica "Estou ausente". Portanto, quando os primeiros softwares estatísticos tiveram que diferenciar números "verdadeiros" e valores ausentes, eles colocaram algo que "obviamente" não era um número válido, como -999 ou -9999.

Obviamente, que -999 ou -9999 significava um valor ausente não é "óbvio". Muitas vezes, certamente pode ser um valor válido. A menos que você verifique explicitamente esses valores, você pode ter todos os tipos de erros "interessantes" em suas análises.

Atualmente, vetores numéricos que podem conter valores ausentes são representados internamente como vetores numéricos "enriquecidos", ou seja, vetores numéricos com informações adicionais sobre quais valores estão ausentes. É claro que isso é muito melhor, porque os valores ausentes serão tratados como tal e não serão tratados por engano como válidos.

Infelizmente, alguns softwares ainda usam essa convenção, talvez para compatibilidade. E alguns usuários adotaram essa convenção por osmose informal e inseriram -999 em vez de NA, mesmo que seu software suporte a entrada limpa de valores ausentes.

Moral: não codifique valores ausentes como -999.

S. Kolassa - Restabelecer Monica
fonte
1
Além de ser um destaque de épocas anteriores, é provável que pessoas que nunca aprenderam a existência de representação explícita de valores ausentes e, portanto, quando precisem inserir um valor ausente, conclua que a coisa a ser usada é algum tipo de farsa número.
Kodiologist
9
Isso não é apenas uma coisa de destaque. Se estou escrevendo uma ferramenta para manipular dados, a leitura em colunas de números é fácil em praticamente qualquer linguagem de programação existente. Ler valores, detectar valores não numéricos e analisá-los de acordo leva muito mais tempo. E se você acha que -9999 se interessa pelas estatísticas, meu grupo com quem trabalho desenvolveu um amor por usar 1e32 para valores inválidos. Deixe-me dizer o que acontece com a sua variação quando você faz isso!
Cort Ammon - Reinstale Monica
1
Ótima resposta sucinta. Mas adicionar alguns detalhes históricos pode torná-lo uma resposta ainda melhor. É certo que isso exigiria alguma pesquisa. :)
tchakravarty 23/07
1
Essa codificação também pode ser usada para indicar algum outro tipo de erro de medição; ou seja, "a máquina não estava funcionando" vs. "ninguém estava lá para fazer a medição".
Hao Ye
1
@qqqwww: seria melhor detectar o valor usado para indicar falta e converter essas entradas em falta verdadeira ou NA. A discretização de dados numéricos geralmente não é uma boa ideia.
S. Kolassa - Restabelece Monica
24

Esses valores são para bancos de dados. A maioria dos bancos de dados há muito tempo, e muitos hoje, alocou um número fixo de dígitos para dados com valor inteiro. Um número como -999 é o menor que pode ser armazenado em quatro caracteres, -9999 em cinco caracteres e assim por diante.

(Não é necessário dizer que, por definição, um campo numérico não pode armazenar caracteres alfanuméricos como "NA". É necessário usar algum código numérico para representar dados ausentes ou inválidos.)

Por que usar o número mais negativo que pode ser armazenado para indicar um valor ausente? Porque se você tratá-lo por engano como um número válido, deseja que os resultados sejam dramaticamente incorretos. Quanto mais seus códigos para valores ausentes forem realistas, mais seguro você fica, porque entradas extremamente erradas geralmente estragam a saída. (Métodos estatísticos robustos são exceções notáveis!)

Como esse erro pode acontecer? Isso ocorre o tempo todo quando os dados são trocados entre sistemas. Um sistema que assume que -9999 representa um valor ausente, emitirá esse valor alegremente quando você gravar os dados na maioria dos formatos, como CSV. O sistema que lê esse arquivo CSV pode não "saber" (ou não ser "informado") para tratar esses valores como ausentes.

Outro motivo é que bons dados estatísticos e plataformas de computação reconhecem muitos tipos diferentes de valores ausentes: NaNs, valores realmente ausentes, estouros, subfluxos, não respostas, etc. etc. Dedicando os valores mais negativos possíveis (como -9999, - 9998, -9997, etc), facilita a consulta de todos os valores ausentes de qualquer tabela ou matriz.

Ainda outro é que esses valores geralmente aparecem em exibições gráficas como valores extremos extremos. De todos os valores que você pode escolher destacar em um gráfico, o mais negativo possível tem a maior chance de estar longe de seus dados.


Existem implicações e generalizações úteis:

  • -10303

  • Adote uma regra padrão desse tipo para facilitar a invenção de códigos NoData em novas circunstâncias (quando você estiver projetando seu próprio software de banco de dados).

  • Projete seu software e sistemas para falhar drasticamente se eles falharem. Os piores erros são aqueles que são intermitentes, aleatórios ou minúsculos, porque podem passar despercebidos e difíceis de caçar.

whuber
fonte
2
NaN-10303
NaN não é um número, NA não está disponível pelo menos em R
llrs
1
Em teoria, os flutuadores IEEE suportam diferentes tipos de NaNs, que funcionariam bem como tags para diferentes tipos de dados ausentes / inválidos. Na prática, a maioria das linguagens de programação não possui suporte adequado para distinguir esses NaNs e é propensa a perder essas informações extras.
CodesInChaos
Muito bom, exceto pelo bit de sinal, não ocupou espaço no esquema realmente usado pelos bancos de dados. Eles se dividiam em pares de dígitos de 00 a 99 e os tratavam como números; mas se o número fosse negativo, eles armazenariam 255 - # em vez de número. Também 127 e 128 foram usados ​​para +/- inf.
Joshua
@ Joshua Isso pode estar correto para alguns bancos de dados, mas definitivamente não foi o caso de muitos outros, especialmente no início do desenvolvimento. Qualquer banco de dados que use valores codificados decimais não poderia ter usado o mecanismo que você propõe. Um exemplo de um banco de dados de PC antigo e amplamente usado que funciona da maneira que descrevi é o dBase, eventualmente oferecido como os produtos dBase III, Clipper e FoxPro (adquiridos pela Microsoft e posteriormente abandonados em favor do Access). Para formatos de intercâmbio de dados com largura de campo fixa, o sinal de menos sempre ocupa um caractere.
whuber
13

Você pode usar qualquer coisa para codificar valores ausentes. Alguns softwares, como R, usam valores especiais para codificar dados ausentes, mas também existem pacotes de software, por exemplo, SPSS, que não possuem códigos especiais para dados ausentes. No segundo caso, você precisa fazer uma escolha arbitrária para esses valores. Você pode escolher qualquer coisa , mas geralmente é uma boa ideia escolher algum valor que difira visivelmente dos seus dados (por exemplo, seus dados são porcentagens no intervalo de 0 a 100); portanto, você escolhe 999 para codificar dados ausentes ou os dados são da idade humana e você usa valores negativos para observações ausentes). A idéia por trás disso é que, ao fazer isso, você poderá perceber se algo deu errado e os números não se somam.

O problema com essa codificação é, no entanto, que você realmente não pode perceber a codificação especial e acabar com os resultados do lixo.

Tim
fonte
2

Existem variáveis ​​computadas no conjunto de dados? Ou esse é um conjunto de dados analíticos que vem de dados mesclados / classificados? Alguns softwares usam valores negativos muito grandes para indicar dados ausentes. Mas outro software cria valores ausentes com NA ou .. Quando são discrepantes, geralmente algum pós-processamento leva a discordâncias.

AdamO
fonte
2

Obviamente, no SPSS, o (s) valor (es) ausente (s) 999 ou o que IS está marcado como um código faltante especial e tratado separadamente de outros valores. Pode ser tabulado separadamente ou totalmente excluído. É feita uma distinção a partir do resultado de coisas como divisão zero ou log (0).

JKP
fonte