Como devo transformar dados não negativos, incluindo zeros?

191

Se tenho dados positivos altamente distorcidos, geralmente tomo logs. Mas o que devo fazer com dados não negativos altamente distorcidos que incluem zeros? Eu vi duas transformações usadas:

  • log(x+1) que possui o recurso puro que 0 mapeia para 0.
  • log(x+c) que c é estimado ou definido como um valor positivo muito pequeno.

Existem outras abordagens? Existem boas razões para preferir uma abordagem a outras?

Rob Hyndman
fonte
19
Eu resumiu algumas das respostas mais algum outro material em robjhyndman.com/researchtips/transformations
Rob Hyndman
5
excelente maneira de transformar e promover o stat.stackoverflow!
Robin girard
Sim, concordo com @robingirard (acabei de chegar aqui agora por causa da publicação no blog de Rob)!
Ellie Kesselman
Consulte também stats.stackexchange.com/questions/39042/… para obter um aplicativo para dados censurados à esquerda (que podem ser caracterizados, até uma mudança de local, exatamente como na presente pergunta).
whuber
2
Parece estranho perguntar sobre como se transformar sem ter declarado o propósito de se transformar em primeiro lugar. Qual é a situação? Por que é necessário transformar? Se não sabemos o que você está tentando alcançar, como alguém pode sugerir alguma coisa ? (É claro que não se pode esperar para transformar à normalidade, porque a existência de uma probabilidade (não-zero) de zeros exatas implica um aumento na distribuição de zero, o que spike nenhuma transformação irá remover -. Só pode movê-lo)
Glen_b

Respostas:

55

Parece-me que a escolha mais apropriada de transformação depende do modelo e do contexto.

O ponto '0' pode surgir de várias razões diferentes, cada uma das quais pode ter que ser tratada de maneira diferente:

  • Truncamento (como no exemplo de Robin): Use modelos apropriados (por exemplo, misturas, modelos de sobrevivência etc.)
  • Dados ausentes: imputar dados / eliminar observações, se apropriado.
  • Ponto zero natural (por exemplo, níveis de renda; uma pessoa desempregada tem renda zero): Transforme conforme necessário
  • Sensibilidade do instrumento de medição: talvez adicione uma pequena quantidade aos dados?

Na verdade, não estou oferecendo uma resposta, pois suspeito que não haja transformação universal e "correta" quando você tiver zeros.


fonte
6
Todas as respostas à minha pergunta forneceram informações úteis e eu votei em todas elas. Mas só posso selecionar uma resposta e a Srikant's fornece a melhor visão geral da IMO.
Rob Hyndman
2
Observe também que existem modelos inflados com zero (zeros extras e você se preocupa com alguns zeros: um modelo de mistura) e modelos de obstáculos (zeros e você se preocupa com não zeros: um modelo de dois estágios com um modelo censurado inicial).
Wayne
82

Ninguém mencionou a transformação inversa do seno hiperbólico. Então, para completar, estou adicionando aqui.

Isto é uma alternativa para as transformações de Box-Cox e é definida por onde θ > 0 . Para qualquer valor de θ , zero é mapeado para zero. Há também uma versão de dois parâmetros que permite uma mudança, assim como na transformação BC de dois parâmetros.

f(y,θ)=sinh1(θy)/θ=log[θy+(θ2y2+1)1/2]/θ,
θ>0θBurbidge, Magee e Robb (1988) discutem a transformação de IHS incluindo a estimativa de .θ

A transformação IHS trabalha com dados definidos em toda a linha real, incluindo valores negativos e zeros. Para valores grandes de ele se comporta como uma transformação de log, independentemente do valor de θ (exceto 0). O caso limitante como θ 0 fornece f ( y , θ ) y .yθθ0f(y,θ)y

Parece-me que a transformação do IHS deve ser muito mais conhecida do que é.

Rob Hyndman
fonte
11
Parece ser uma boa alternativa a / transformações de logísticatanh
o Firebug
11
Sobre o IHS, alguns parecem discordar: onlinelibrary.wiley.com/doi/10.1890/10-0340.1/abstract
kjetil b halvorsen
3
Esse artigo trata da transformação inversa do seno, não do seno hiperbólico inverso.
Bryan
42

Uma abordagem útil quando a variável é usada como fator independente na regressão é substituí-la por duas variáveis: uma é um indicador binário de se é zero e a outra é o valor da variável original ou sua re-expressão, como seu logaritmo. Essa técnica é discutida no livro de Hosmer & Lemeshow sobre regressão logística (e em outros lugares, tenho certeza). Gráficos de probabilidade truncados da parte positiva da variável original são úteis para identificar uma reexpressão apropriada. (Veja a análise em https://stats.stackexchange.com/a/30749/919 para exemplos.)

Quando a variável é dependente em um modelo linear, a regressão censurada (como Tobit ) pode ser útil, evitando novamente a necessidade de produzir um logaritmo iniciado. Essa técnica é comum entre economistas.

whuber
fonte
11
A modelagem de dados como um Poisson inflado a zero é um caso especial dessa abordagem?
David LeBauer 13/09/12
4
@ David, embora pareça semelhante, não é, porque o ZIP é um modelo da variável dependente , não a variável independente.
whuber
11
@whuber Esta técnica é discutida no livro de Hosmer & Lemeshow sobre regressão logística. Por acaso você saberia em que capítulo eles discutem essa técnica? Eu estou olhando para o seu livro, mas não consigo encontrar a página certa ...
landroni
11
@landroni H&L estava fresco em minha mente naquela época, então me sinto confiante de que há algo nesse livro relacionado a esse tópico. (Eu o havia consultado para desenvolver alguns modelos de regressão muito grandes e muitas das variáveis ​​independentes tiveram que ser tratadas dessa maneira.) No entanto, também não consigo encontrar a referência neste momento. Eu escrevi sobre essa técnica em postagens subseqüentes, caso você esteja procurando detalhes. Dois que aparecem em uma pesquisa no site estão em stats.stackexchange.com/questions/6563 e stats.stackexchange.com/questions/4831 .
whuber
11
@landroni Sim, eles são equivalentes, da mesma maneira que todas as codificações numéricas de qualquer variável binária são equivalentes. Escolha o que você achar mais conveniente para interpretar.
whuber
37

As transformações de log com turnos são casos especiais das transformações de Box-Cox :

y(λ1,λ2)={(y+λ2)λ11λ1when λ10log(y+λ2)when λ1=0

Essa é a forma estendida para valores negativos, mas também aplicável a dados que contêm zeros. Box e Cox (1964) apresentam um algoritmo para encontrar valores apropriados para os 's usando a máxima verossimilhança. Isso lhe dá a transformação definitiva. λ

Um motivo para preferir as transformações de Box-Cox é que elas são desenvolvidas para garantir suposições para o modelo linear. Há algum trabalho feito para mostrar que, mesmo que seus dados não possam ser transformados em normalidade, o estimado ainda levará a uma distribuição simétrica.λ

Não sei ao certo como isso trata seus dados, pois pode ser que que é apenas a transformação de log que você mencionou, mas pode valer a pena estimar os λ solicitados para ver se outra transformação é apropriado.λ=(0,1)λ

Em R, a boxcox.fitfunção no pacote geoRcalculará os parâmetros para você.

ars
fonte
hmm, não é possível que os "casos iniciais" de látex aceitem novas linhas. : - /
ars
@ars Corrigi os eqns para usar casos de início. Espero não ter mutilado os eqns no processo.
11
@ Rob: Oh, desculpe. O geoR do Diggle é o caminho a seguir - mas especifique lambda2=TRUEnos argumentos para boxcox.fit. (Também atualizei a resposta.)
ars
3
@ gd047: aqui está uma referência agradável: elevatorlady.ca/doc/refcard/expressions.html
ars
6
Para quem lê isso perguntando o que aconteceu com essa função, agora é chamado boxcoxfit.
stragu 2/08/12
19

Estou presumindo que zero! = Falta de dados, pois essa é uma pergunta totalmente diferente.

Ao pensar em como lidar com zeros na regressão linear múltipla, costumo considerar quantos zeros realmente temos?

Apenas alguns zeros

Se eu tiver um único zero em um conjunto de dados razoavelmente grande, tenderá a:

  1. Remova o ponto, pegue toras e ajuste o modelo
  2. c

c

Você pode tornar esse procedimento um pouco menos bruto e usar o método boxcox com os turnos descritos na resposta do ars.

Grande número de zeros

Se meu conjunto de dados contiver um grande número de zeros, isso sugere que a regressão linear simples não é a melhor ferramenta para o trabalho. Em vez disso, usaria algo como modelagem de mistura (como sugerido por Srikant e Robin).

csgillespie
fonte
15

Se você quer algo rápido e sujo, por que não usar a raiz quadrada?

user856
fonte
7
E freqüentemente a transformação da raiz do cubo funciona bem e permite zeros e negativos. Descobri que a raiz do cubo funciona particularmente bem quando, por exemplo, a medição é um volume ou uma contagem de partículas por unidade de volume. A raiz do cubo a converteria em uma dimensão linear. Uma abordagem mais flexível é ajustar um spline cúbico restrito (spline natural) na raiz do cubo ou na raiz quadrada, permitindo um pequeno afastamento da forma assumida.
precisa
2
+1. Para um pequeno artigo sobre as raízes dos cubos, consulte stata-journal.com/article.html?article=st0223 (este será um arquivo .pdf gratuito do primeiro trimestre de 2014.)
Nick Cox
2
Uma raiz quadrada de zero é zero, portanto, apenas os valores diferentes de zero são transformados. Isso não faz nada para lidar com o pico, se o valor for zero e pode causar sérios problemas se, em grupos, cada um tiver uma quantidade diferente de zeros. Em outras palavras, se alguns grupos têm muitos zeros e outros têm poucos, essa transformação pode afetar muitas coisas de maneira negativa. Para o grupo com a maior variância (também teve menos zeros), quase todos os valores estão sendo transformados. Por outro lado, aqueles com mais zeros, pouco dos valores são transformados. Isso pode alterar qual grupo tem a maior variação.
D_Williams
Nenhuma transformação manterá a variação no caso descrito por @D_Williams. Os modelos de mistura (mencionados em outras partes deste segmento) provavelmente seriam uma boa abordagem nesse caso.
mkt 19/09
10

Presumo que você tenha dados contínuos.

Se os dados incluem zeros, isso significa que você tem um pico no zero, o que pode ser devido a algum aspecto específico dos seus dados. Aparece, por exemplo, em energia eólica, vento abaixo de 2 m / s produz energia zero (é chamado de corte) e vento sobre (algo em torno de) 25 m / s também produz energia zero (por razões de segurança, é chamado corte) . Enquanto a distribuição da energia eólica produzida parece contínua, há um pico em zero.

Minha solução: neste caso, sugiro tratar os zeros separadamente, trabalhando com uma mistura do pico em zero e o modelo que você planejou usar para a parte da distribuição que é contínua (Lebesgue).

Robin Girard
fonte
9

Comparando a resposta fornecida por @RobHyndman a uma transformação de log mais um estendida para valores negativos com o formulário:

T(x)=sign(x)log(|x|+1)
r = -1000:1000

l = sign(r)*log1p(abs(r))
l = l/max(l)
plot(r, l, type = "l", xlab = "Original", ylab = "Transformed", col = adjustcolor("red", alpha = 0.5), lwd = 3)

#We scale both to fit (-1,1)
for(i in exp(seq(-10, 100, 10))){
  s = asinh(i*r)

  s = s / max(s)
  lines(r, s, col = adjustcolor("blue", alpha = 0.2), lwd = 3)
}
legend("topleft", c("asinh(x)", "sign(x) log(abs(x)+1)"), col = c("blue", "red"), lty = 1)

θθ1θ0

insira a descrição da imagem aqui


θx=0

Firebug
fonte
8

Como o ajuste de dois parâmetros Box-Cox foi proposto, aqui estão alguns R para ajustar os dados de entrada, execute uma função arbitrária (por exemplo, previsão de séries temporais) e retorne a saída invertida:

# Two-parameter Box-Cox function
boxcox.f <- function(x, lambda1, lambda2) {
  if (lambda1!=0) {
    return(((x + lambda2) ^ lambda1 - 1) / lambda1)
  } else {
    return(log(x + lambda2))
  }
}

# Two-parameter inverse Box-Cox function
boxcox.inv <- function(x, lambda1, lambda2) {
  if (lambda1!=0) {
    return((lambda1 * x + 1) ^ (1 / lambda1) - lambda2)
  } else {
    return(exp(x) - lambda2)
  }
}

# Function to Box-Cox transform x, apply function g, 
# and return inverted Box-Cox output y
boxcox.fit.apply <- function(x, g) {
  require(geoR)
  require(plyr)

  # Fit lambdas
  t <- try(lambda.pair <- boxcoxfit(x, lambda2=T)$lambda)

  # Estimating both lambdas sometimes fails; if so, estimate lambda1 only
  if (inherits(t, "try-error")) {
    lambda1 <- boxcoxfit(x)$lambda
    lambda2 <- 0
  } else {
    lambda1 <- lambda.pair[1]
    lambda2 <- lambda.pair[2]
  }
  x.boxcox <- boxcox.f(x, lambda1, lambda2)

  # Apply function g to x.boxcox. This should return data similar to x (e.g. ts)
  y <- aaply(x.boxcox, 1, g)

  return(boxcox.inv(y, lambda1, lambda2))
}
Max Ghenis
fonte
5

Suponha que Y seja a quantia que cada americano gasta em um carro novo em um determinado ano (preço total de compra). Y aumentará em 0; não terá valores entre 0 e cerca de 12.000; e terá outros valores principalmente na adolescência, na faixa dos vinte e nos trinta anos. Os preditores seriam procuradores para o nível de necessidade e / ou interesse em fazer essa compra. Dificilmente seria necessário dizer que a necessidade ou o interesse é zero para indivíduos que não fizeram compras; nessas escalas, os não compradores estariam muito mais próximos dos compradores do que Y ou mesmo o log de Y sugeriria. Em um caso como esse, mas na área da saúde, descobri que as previsões mais precisas, julgadas pela validação cruzada de conjunto de teste / conjunto de treinamento, foram obtidas por, em ordem crescente,

  1. Regressão logística em uma versão binária de Y,
  2. OLS em Y,
  3. Regressão ordinal (PLUM) em Y agrupada em 5 categorias (de modo a dividir os compradores em 4 grupos de tamanhos iguais),
  4. Regressão logística multinomial em Y agrupada em 5 categorias,
  5. OLS no log (10) de Y (não pensei em tentar a raiz do cubo) e
  6. O OLS em Y foi dividido em 5 categorias.

Alguns irão recuar nessa categorização de uma variável dependente contínua. Porém, embora sacrifique algumas informações, categorizar parece ajudar a restaurar um importante aspecto subjacente da situação - novamente, que os "zeros" são muito mais semelhantes aos demais do que Y indicaria.

rolando2
fonte
4
Você também pode dividi-lo em dois modelos: a probabilidade de comprar um carro (resposta binária) e o valor do carro em uma compra. Esta é a prática padrão em muitos campos, por exemplo, de seguro, de risco de crédito, etc.
Hong Ooi
11
@ HongOoi - você pode sugerir alguma leitura sobre quando essa abordagem é e não é aplicável?
Roland2
4

A transformação de energia da Yeo-Johnson discutida aqui tem excelentes propriedades projetadas para lidar com zeros e negativos, enquanto constrói os pontos fortes da transformação de energia da Box Cox. É para isso que normalmente vou quando estou lidando com zeros ou dados negativos.

Aqui está um resumo das transformações com prós / contras para ilustrar por que a Yeo-Johnson é preferível.

Registro

Prós: funciona bem com dados positivos.

Contras: Não manipula zeros.

> log(0)
[1] -Inf

Log Plus 1

Prós: O deslocamento mais 1 adiciona a capacidade de lidar com zeros, além de dados positivos.

Contras: falha com dados negativos

> log1p(-1)
[1] -Inf
> log1p(-2)
[1] NaN
Warning message:
In log1p(-2) : NaNs produced

Raiz quadrada

Prós: usa uma transformação de energia que pode lidar com zeros e dados positivos.

Contras: falha com dados negativos

> sqrt(-1)
[1] NaN
Warning message:
In sqrt(-1) : NaNs produced

Box Cox

Código R:

box_cox <- function(x, lambda) {

    eps <- 0.00001
    if (abs(lambda) < eps)
        log(x)
    else
        (x ^ lambda - 1) / lambda

}

Prós: permite transformações de energia em escala

Contras: sofre de problemas com zeros e negativos (ou seja, pode lidar apenas com dados positivos.

> box_cox(0, lambda = 0)
[1] -Inf
> box_cox(0, lambda = -0.5)
[1] -Inf
> box_cox(-1, lambda = 0.5)
[1] NaN

Yeo Johnson

Código R:

yeo_johnson <- function(x, lambda) {

    eps <- .000001
    not_neg <- which(x >= 0)
    is_neg  <- which(x < 0)

    not_neg_trans <- function(x, lambda) {
        if (abs(lambda) < eps) log(x + 1)
        else ((x + 1) ^ lambda - 1) / lambda
    }

    neg_trans <- function(x, lambda) {
        if (abs(lambda - 2) < eps) - log(-x + 1)
        else - ((-x + 1) ^ (2 - lambda) - 1) / (2 - lambda)
    }

    x[not_neg] <- not_neg_trans(x[not_neg], lambda)

    x[is_neg] <- neg_trans(x[is_neg], lambda)

    return(x)

}

Prós: pode lidar com dados positivos, zero e negativos.

Contras: Nada que eu possa pensar. As propriedades são muito semelhantes ao Box-Cox, mas podem lidar com dados zero e negativos.

> yeo_johnson(0, lambda = 0)
[1] 0
> yeo_johnson(0, lambda = -0.5)
[1] 0
> yeo_johnson(-1, lambda = 0.5)
[1] -1.218951
Matt Dancho
fonte
11
Contras para Yeo-Johnson: transformação complexa e separada para pontos positivos e negativos e para valores em ambos os lados da lambda, valor de ajuste mágico (epsilon; e o que é lambda?). Nenhuma vantagem prontamente aparente em comparação com a transformação de log estendida negativa mais simples mostrada na resposta do Firebug, a menos que você precise de transformações de energia em escala (como em Box – Cox).
Konrad Rudolph
1

Para esclarecer como lidar com o logaritmo zero nos modelos de regressão, escrevemos um artigo pedagógico explicando a melhor solução e os erros comuns que as pessoas cometem na prática. Também lançamos uma nova solução para resolver esse problema.

Você pode encontrar o artigo clicando aqui: https://ssrn.com/abstract=3444996

log(y)=βlog(x)+εβyx

YY+c>0

Em nosso artigo, na verdade, fornecemos um exemplo em que a adição de constantes muito pequenas fornece o viés mais alto. Nós fornecemos derivar uma expressão do viés.

Na verdade, a Poisson Pseudo Maximum Likelihood (PPML) pode ser considerada uma boa solução para esse problema. É preciso considerar o seguinte processo:

yi=aiexp(α+xiβ)E(ai|xi)=1

βaiyi=0E(ai|xi)=1E(yiexp(α+xiβ)|xi)=0

i=1N(yiexp(α+xiβ))xi=0

yi=0

β

log(yi+exp(α+xiβ))=xiβ+ηi

Mostramos que esse estimador é imparcial e que pode ser simplesmente estimado com o GMM com qualquer software estatístico padrão. Por exemplo, pode ser estimado executando apenas uma linha de código com o Stata.

Esperamos que este artigo possa ajudar e gostaríamos de receber seus comentários.

Christophe Bellégo e Louis-Daniel Pape CREST - Ecole Polytechnique - ENSAE

Christophe Bellégo
fonte