0을 포함하여 음이 아닌 데이터를 어떻게 변환해야합니까?


191

긍정적 인 데이터가 치우친 경우 종종 로그를 가져옵니다. 그러나 0을 포함하는 비대칭 비대칭 데이터로 무엇을해야합니까? 나는 두 가지 변형이 사용되는 것을 보았다.

  • log(x+1)0은 0에 매핑되는 깔끔한 기능을 가진 입니다.
  • log(x+c) 여기서 c는 추정되거나 매우 작은 양의 값으로 설정됩니다.

다른 접근법이 있습니까? 하나의 접근법을 다른 접근법보다 선호해야 할 이유가 있습니까?



5
stat.stackoverflow를 변환하고 촉진하는 훌륭한 방법!
로빈 지라드

예, @robingirard에 동의합니다 (Rob의 블로그 게시물로 인해 여기에 도착했습니다)!
Ellie Kesselman

또한 왼쪽 검열 된 데이터에 대한 응용 프로그램 (현재 질문에서와 같이 위치 이동까지 특성화 할 수 있음) 은 stats.stackexchange.com/questions/39042/… 를 참조하십시오 .
whuber

2
처음에는 변형의 목적을 밝히지 않고 변형하는 방법에 대해 묻는 것이 이상하게 보입니다. 상황은 어떻습니까? 왜 변형해야합니까? 우리가 무엇을 성취하려고하는지 모른다면 어떻게 합리적으로 제안 할 있습니까? (정확한 0이 아닌 (0이 아닌) 확률의 존재는 0에서 분포의 급상승을 암시하므로 변환이 제거되지 않을 것입니다-그것은 단지 이동할 수 있습니다.)
Glen_b

답변:


55

가장 적절한 변형의 선택은 모델과 상황에 따라 달라 보입니다.

'0'포인트는 여러 가지 이유로 인해 발생할 수 있으며 각 이유는 각각 다르게 처리해야합니다.

  • 잘림 (Robin의 예에서와 같이) : 적절한 모델 (예 : 혼합물, 생존 모델 등)을 사용하십시오.
  • 누락 된 데이터 : 필요한 경우 데이터를 대치하거나 관측치를 삭제합니다.
  • 자연적인 영점 (예 : 소득 수준; 실직자는 소득이 없음) : 필요에 따라 변환
  • 측정기의 감도 : 아마도 데이터에 소량을 추가 하시겠습니까?

제로가있을 때 보편적이고 '올바른'변형이 없다고 생각하기 때문에 실제로 대답하지 않습니다.


6
내 질문에 대한 모든 대답은 유용한 정보를 제공했으며 모든 것을 찬성했습니다. 그러나 하나의 답변 만 선택할 수 있으며 Srikant는 최고의 개요 IMO를 제공합니다.
Rob Hyndman

2
또한 제로 팽창 된 모델 (추가 제로 및 일부 제로에 관심이있는 경우 : 혼합 모델)과 장애물 모델 (제로에 해당하며 0이 아닌 경우에 관심이있는 경우 : 초기 검열 된 모델이있는 2 단계 모델)도 있습니다.
Wayne

82

아무도 역 쌍곡 사인 변환을 언급하지 않았습니다. 완전성을 위해 여기에 추가하겠습니다.

이것은 Box-Cox 변환의 대안이며 여기서 . 값에 대해 0은 0에 매핑됩니다. 2 파라미터 BC 변환과 마찬가지로 시프트를 허용하는 2 파라미터 버전도 있습니다. Burbidge, Magee and Robb (1988) 는 추정을 포함한 IHS 변환에 대해 논의했다 .

f(y,θ)=sinh1(θy)/θ=log[θy+(θ2y2+1)1/2]/θ,
θ>0θθ

IHS 변환은 음수 값과 0을 포함하여 전체 실제 라인에 정의 된 데이터로 작동합니다. 값이 크면 값 (0 제외)에 관계없이 로그 변환처럼 동작 합니다. 같은 제한 경우 제공 .yθθ0f(y,θ)y

그것은 IHS 변환이 그것보다 훨씬 더 잘 알려져 있어야하는 것처럼 보입니다.


1
/ logistic 변환 의 좋은 대안으로 보입니다tanh
Firebug


3
이 논문은 역 쌍곡 사인이 아니라 역 사인 변환에 관한 것입니다.
Bryan

42

변수가 회귀에서 독립 요인으로 사용될 때 유용한 방법은 변수를 두 변수로 대체하는 것입니다. 하나는 변수가 0인지 여부에 대한 이진 표시기이고 다른 하나는 원래 변수의 값 또는 변수의 재 표현입니다. 로그와 같은. 이 기술은 로지스틱 회귀에 대한 Hosmer & Lemeshow의 저서 (그리고 다른 곳에서는 확실합니다) 에서 논의됩니다 . 원래 변수의 양수 부분의 잘린 확률도는 적절한 재 발현을 식별하는 데 유용합니다. ( 예 는 https://stats.stackexchange.com/a/30749/919 의 분석을 참조하십시오 .)

변수가 선형 모델에서 종속 변수 인 경우 검열 된 회귀 (예 : Tobit )가 유용 할 수 있으며 다시 시작 로그를 생성 할 필요가 없습니다. 이 기술은 계량 경제학자에게 공통적입니다.


1
제로 팽창 된 포아송으로 모델링 데이터가이 접근법의 특별한 경우입니까?
David LeBauer

4
@David는 비슷해 보이지만 ZIP은 독립 변수가 아닌 종속 변수 의 모델이기 때문에 그렇지 않습니다.
whuber

1
@whuber 이 기술은 로지스틱 회귀 분석에 관한 Hosmer & Lemeshow의 저서에서 논의됩니다. 어떤 기술 장에서이 기술에 대해 논의하고 있는지 알고 싶습니까? 나는 그들의 책을보고 있지만 올바른 페이지를 찾을 수없는 것 같습니다.
landroni

1
@landroni H & L은 그때 내 마음에 신선한, 그래서 거기에 자신감 뭔가 이 주제와 관련된 책에서이. (나는 매우 큰 회귀 모델을 개발하기 위해 그것과 협의했으며 많은 독립 변수를 이런 식으로 처리해야했다.) 그러나이 시점에서 참조를 찾을 수 없다. 자세한 내용을 찾고있는 경우 후속 게시물 에서이 기술에 대해 작성했습니다. 사이트 검색에 나타나는 두 가지는 stats.stackexchange.com/questions/6563stats.stackexchange.com/questions/4831에 있습니다.
whuber

1
@landroni 예, 이진 변수의 모든 숫자 인코딩이 동일하는 방식과 동일합니다. 가장 해석하기 쉬운 것을 선택하십시오.
whuber

37

시프트가있는 로그 변환은 Box-Cox 변환 의 특수한 경우입니다 .

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

음수 값의 확장 된 형식이지만 0이 포함 된 데이터에도 적용됩니다. Box and Cox (1964)는 최대 가능성을 사용하여 적절한 값을 찾는 알고리즘을 제시합니다 . 이것은 당신에게 최고의 변화를 제공합니다. λ

Box-Cox 변환을 선호하는 이유는 선형 모델에 대한 가정을 보장하기 위해 개발 되었기 때문입니다. 데이터를 정규화로 변환 할 수없는 경우에도 추정 된 여전히 대칭 분포로 이어진다 는 것을 보여주기 위해 수행 한 작업이 있습니다 .λ

그것은이 될 수 있기 때문에 나는,이 데이터를 처리하는 방법을 잘하지 확신 단지 로그는 당신이 언급 한 변화 만이 (가) requried 추정 가치가있을 수 있습니다 어떤 의 다른 여부를 확인하려면 변환이 적절합니다.λ=(0,1)λ

R boxcox.fit에서 package 의 함수 geoR는 매개 변수를 계산합니다.


흠, 라텍스 "시작 사례"가 새로운 라인을 받아 들일 수 없습니다. :-/
ars

@ars 시작 사례를 사용하도록 eqns를 수정했습니다. 그 과정에서 방정식을 엉망으로 만들지 않기를 바랍니다.

1
@Rob : 아 죄송합니다. Diggle의 geoR은 갈 길이지만- lambda2=TRUE에 인수로 지정 하십시오 boxcox.fit. (또한 답변을 업데이트했습니다.)
ars

3
@ gd047 : 여기에 좋은 참조가 있습니다 : elevatorlady.ca/doc/refcard/expressions.html
ars

6
이 기능에 무슨 일이 일어 났는지 궁금해하는 사람은 이제 이것을이라고 boxcoxfit합니다.
stragu

19

나는 전혀 다른 질문이므로 zero! = 누락 된 데이터를 가정합니다.

다중 선형 회귀 분석에서 0을 처리하는 방법에 대해 생각할 때 실제로 실제로 0이 몇 개인 지 고려하는 경향이 있습니까?

오직 두 개의 0

상당히 큰 데이터 세트에 단일 0이 있으면 다음과 같은 경향이 있습니다.

  1. 점을 제거하고 로그를 취한 다음 모형에 적합
  2. 점에 작은 를 더하고 로그를 취하고 모형에 적합c

모형 적합이 변경됩니까? 매개 변수 값은 어떻습니까? 모델이 점을 제거하는 데 상당히 견고하다면 를 추가하는 빠르고 더러운 접근법을 사용 합니다.c

이 절차를 조금 덜 조잡하게 만들 수 있으며 ars의 답변에 설명 된 시프트와 함께 boxcox 방법을 사용할 수 있습니다.

많은 수의 0

내 데이터 세트에 많은 수의 0이 포함되어 있으면 간단한 선형 회귀가 작업에 가장 적합한 도구가 아님을 나타냅니다. 대신 Srikant와 Robin이 제안한 혼합 모델링과 같은 것을 사용합니다.


15

빠르고 더러운 것을 원한다면 왜 제곱근을 사용하지 않습니까?


7
그리고 종종 큐브 루트 변환이 잘 작동하며 0과 음수가 허용됩니다. 예를 들어 측정이 단위 부피당 입자 수 또는 입자 수인 경우 큐브 루트가 특히 잘 작동한다는 것을 알았습니다. 큐브 루트는이를 선형 차원으로 변환합니다. 보다 유연한 접근 방식은 입방체 루트 또는 제곱근에 제한된 입방 스플라인 (자연 스플라인)을 맞추는 것으로 가정 된 형태에서 약간 벗어날 수 있습니다.
Frank Harrell

2
+1. 큐브 뿌리에 약간의 글을 참조 stata-journal.com/article.html?article=st0223가 (이 처음으로 분기 2014 년에서 무료로 .PDF 예정)
닉 콕스

2
0의 제곱근은 0이므로 0이 아닌 값만 변환됩니다. 이것은 0이 팽창하면 스파이크를 다루지 않으며 그룹에서 서로 다른 양의 0을 갖는 경우 심각한 문제를 일으킬 수 있습니다. 다시 말해, 일부 그룹에 0이 많고 다른 그룹에 소수가없는 경우이 변환은 많은 방식으로 부정적인 영향을 줄 수 있습니다. 분산이 가장 큰 그룹 (또한 0이 가장 낮음)의 경우 거의 모든 값이 변환됩니다. 반대로 0이 가장 많은 값은 그다지 많이 변환되지 않습니다. 이것은 가장 큰 분산을 가진 그룹을 변경할 수 있습니다.
D_Williams

@D_Williams에 설명 된 경우 변환이 분산을 유지하지 않습니다. 이 경우 다른 곳에서 언급 된 혼합물 모델이 아마도 좋은 접근 방법 일 것입니다.
mkt

10

나는 당신이 지속적인 데이터를 가지고 있다고 가정합니다.

데이터에 0 이 포함 된 경우 이는 데이터의 특정 측면으로 인해 0에 스파이크가 발생했음을 의미합니다. 예를 들어 풍력 에너지, 2m / s 미만의 바람은 제로 파워 (절단이라고 함)를 생성하고 25m / s 이상의 바람은 제로 파워를 생성합니다 (보안상의 이유로 차단이라고 함). . 생산 된 풍력 에너지의 분포는 연속적인 것으로 보이지만 0은 급등합니다.

내 해결책 : 이 경우, 0의 스파이크와 연속 분포의 부분 (Letgue wwr)에 사용하려는 모델을 혼합하여 사용하여 0을 개별적으로 처리하는 것이 좋습니다.


9

@RobHyndman이 제공 한 답변과 로그 플러스 1 변환을 음수 값으로 확장하여 다음 형식으로 비교합니다.

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θθ1θ0

여기에 이미지 설명을 입력하십시오


편집 : 로그 변환은 비슷한 결과로 임의의 스케일로 유사하게 변경 될 수 있습니다. 방금 이전 답변에 따라 비슷한 결과를 제공 하는 를 보여주고 싶었습니다 . 두 접근 방식의 가장 큰 차이점은 파생 상품에서 볼 수 있듯이 근처의 영역 입니다.x = 0θx=0


8

2- 파라미터 맞춤 Box-Cox가 제안되었으므로 여기에 입력 데이터를 맞추고 임의의 함수를 실행 (예 : 시계열 예측) 한 다음 반전 된 출력을 반환하는 R이 있습니다.

# 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))
}

5

Y가 각 미국인이 주어진 해에 새 차에 소비하는 금액 (총 구매 가격)이라고 가정합니다. Y는 0에서 급등합니다. 0과 약 12,000 사이의 값은 전혀 없으며; 그리고 대부분 십대, 20 대, 3 만 명의 다른 가치를 취할 것입니다. 예측자는 그러한 구매에 대한 필요성 및 / 또는 관심의 수준에 대한 프록시 일 것이다. 구매를하지 않은 개인에게는 필요 또는 관심이 거의 없다고 말할 수 없었습니다. 이 비늘에서 비구매자는 Y보다 구매자에게 훨씬 더 가까워 지거나 심지어 Y의 로그가 제안하는 것입니다. 이와 비슷하지만 건강 관리에서 테스트 세트 / 트레이닝 세트 교차 검증으로 판단되는 가장 정확한 예측은

  1. Y의 이진 버전에 대한 로지스틱 회귀
  2. Y의 OLS,
  3. Y의 서수 회귀 (PLUM)는 5 개 범주로 비닝 (구매자를 4 개의 동일한 크기 그룹으로 나누기)
  4. Y에 대한 다항 로지스틱 회귀 분석은 5 개 범주로 분류됩니다.
  5. Y의 로그 (10)에 대한 OLS (큐브 루트를 시도하지 않았다)
  6. Y의 OLS는 5 개 범주로 비닝되었습니다.

일부는 연속 종속 변수의이 분류에서 반동합니다. 그러나 일부 정보는 희생되지만 분류는 상황의 중요한 기본 측면을 복원하여 도움이되는 것으로 보입니다. 다시 말하지만 "0"은 Y가 나타내는 것보다 나머지와 훨씬 더 유사합니다.


4
자동차를 구매할 확률 (바이너리 응답)과 구매시 자동차의 가치라는 두 가지 모델로 나눌 수도 있습니다. 이것은 보험, 신용 위험 등과 같은 많은 분야에서 표준 관행입니다.
Hong Ooi

1
@HongOoi-이 방법이 적용 가능하고 적용되지 않는 경우에 대한 정보를 제안 할 수 있습니까?
rolando2

4

여기에서 논의 된 Yeo-Johnson 전력 변환 은 Box Cox 전력 변환의 강점을 바탕으로 0과 음을 처리하도록 설계된 우수한 특성을 가지고 있습니다. 이것은 내가 0 또는 부정적인 데이터를 다룰 때 일반적으로하는 것입니다.

여기 Yeo-Johnson이 바람직한 이유를 설명하기위한 장단점이있는 변환이 요약되어 있습니다.

로그

장점 : 긍정적 인 데이터와 잘 어울립니다.

단점 : 0을 처리하지 않습니다.

> log(0)
[1] -Inf

로그 플러스 1

장점 : 플러스 1 오프셋은 양수 데이터 외에 0을 처리하는 기능을 추가합니다.

단점 : 부정적인 데이터로 실패

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

제곱근

장점 : 0과 양의 데이터를 처리 할 수있는 전력 변환을 사용합니다.

단점 : 부정적인 데이터로 실패

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

박스 콕스

R 코드 :

box_cox <- function(x, lambda) {

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

}

장점 : 확장 된 전력 변환 가능

단점 : 0과 음수 문제로 어려움을 겪습니다 (즉, 긍정적 인 데이터 만 처리 할 수 ​​있음).

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

여 존슨

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)

}

장점 : 양수, 제로 및 음수 데이터를 처리 할 수 ​​있습니다.

단점 : 내가 생각할 수있는 것은 없다. 속성은 Box-Cox와 매우 유사하지만 0 및 음수 데이터를 처리 할 수 ​​있습니다.

> yeo_johnson(0, lambda = 0)
[1] 0
> yeo_johnson(0, lambda = -0.5)
[1] 0
> yeo_johnson(-1, lambda = 0.5)
[1] -1.218951

1
Yeo-Johnson의 단점 : 양수와 음수, 람다 양쪽의 값, 마법 튜닝 값 (엡실론, 람다 란 무엇인가)에 대한 복잡하고 개별적인 변환. Box-Cox와 같이 확장 된 전력 변환이 필요하지 않으면 Firebug의 답변에 표시된 간단한 음의 확장 로그 변환과 비교할 때 명백한 이점이 없습니다.
Konrad Rudolph

1

회귀 모델에서 0의 로그를 처리하는 방법을 명확히하기 위해 우리는 사람들이 실제로 범하는 가장 좋은 해결책과 일반적인 실수를 설명하는 교육 논문을 작성했습니다. 또한이 문제를 해결하기위한 새로운 솔루션을 개발했습니다.

여기를 클릭하여 논문을 찾을 수 있습니다 : https://ssrn.com/abstract=3444996

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

YY+c>0

이 기사에서는 실제로 매우 작은 상수를 추가하는 것이 실제로 가장 높은 편향을 제공하는 예를 제공합니다. 우리는 편견의 표현을 제공합니다.

실제로 Poisson Pseudo Maximum Likelihood (PPML)는이 문제에 대한 좋은 해결책으로 간주 될 수 있습니다. 다음 프로세스를 고려해야합니다.

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

우리는이 추정기가 편견이 없으며 표준 통계 소프트웨어를 사용하여 GMM으로 간단히 추정 할 수 있음을 보여줍니다. 예를 들어 Stata를 사용하면 한 줄의 코드 만 실행하여 추정 할 수 있습니다.

이 기사가 도움이 되길 바랍니다. 여러분의 의견을 기다리고 있습니다.

Christophe Bellégo와 Louis-Daniel Pape CREST-에코 폴리 테크닉-ENSAE

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.