음수 값을 로그로 변환하는 방법은 무엇입니까?


12

Log()이 분산 데이터가 있으므로 음수 값을로 변환하는 방법을 알고 싶습니다 . 수식에서 작동한다는 것을 읽었 Log(x+1)지만 데이터베이스에서는 작동하지 않으며 결과적으로 NaN을 계속 얻습니다. 예를 들어이 경고 메시지가 나타납니다 (음수 값 중 하나를 사용하면 예를 보여주기에 충분하다고 생각하기 때문에 전체 데이터베이스를 넣지 않았습니다).

> log(-1.27+1)
[1] NaN
Warning message:
In log(-1.27 + 1) : NaNs produced
> 

미리 감사드립니다

최신 정보:

여기 내 데이터의 히스토그램이 있습니다. 나는 고 생물학적 시계열 화학 측정을 사용하고 있습니다. 예를 들어 Ca와 Zn과 같은 변수의 차이가 너무 큽니다. 그런 다음 일부 유형의 데이터 표준화가 필요 log()합니다. 그래서 함수를 테스트하고 있습니다. 여기에 이미지 설명을 입력하십시오

이것은 내 원시 데이터입니다


2
로그는 양수에 대해서만 정의되며 일반적으로 양수 데이터에 대한 통계적 변환으로 사용되므로 모델이이 양수를 유지합니다. log(x+1)변환 만 정의되는 것 x > -1다음으로, x + 1긍정적이다. 데이터를 로그 변환하려는 이유를 아는 것이 좋습니다.
Matthew Drury

3
범위, 평균, 음수, 제로 및 양수 값의 주파수를 포함한 데이터에 대해 자세히 알려주십시오. 평균 응답이 긍정적이라고 생각하는 것이 합리적이라면 로그 링크가있는 일반화 된 선형 모델이 데이터에 가장 적합 할 수 있습니다. 전혀 변형되어서는 안될 수도 있습니다.
Nick Cox

6
세부 정보를 추가해 주셔서 감사합니다. 이러한 데이터의 경우 0은 실제로 보존되어야하는 의미 (같음!)를 갖습니다 . 그와 다른 이유로 큐브 루트를 사용합니다. 실제로 sign(x) * (abs(x))^(1/3)소프트웨어 구문에 따라 세부 사항에 대한 변형이 필요 합니다. 큐브 루트에 대한 자세한 내용은 stata-journal.com/sjpdf.html?articlenum=st0223 ( 예 : pp.152-3 참조)을 참조하십시오. 큐브 루트를 사용하여 본질적
Nick Cox

8
차이점 대신 원래 변수 를 변환하지 않는 이유는 무엇 입니까?
whuber

4
수학적 문제를 해결했습니다. @ whuber의 제안이나 큐브 뿌리는 여전히 상수가 순전히 경험적이거나 변수간에 다른 경우 더 쉽게 작업 할 수 있다고 생각합니다. 변환을 선택하는 좋은 규칙은 상상할 수있는 유사한 데이터에 적합한 변환 만 사용하는 것입니다. 따라서 "작품"에 대한 하지만 다음 배치에 의해 경계 경우 실패 ..x > 4 5log(x+4)x>45
닉 콕스

답변:


14

로그는 양수에 대해서만 정의되므로 음수의 로그를 취할 수 없습니다. 그러나 더 나은 데이터 분포를 얻으려는 경우 다음 변환을 적용 할 수 있습니다.

부정적인 데이터를 왜곡했다고 가정합니다.

x <- rlnorm(n = 1e2, meanlog = 0, sdlog = 1)
x <- x - 5
plot(density(x))

그런 다음 첫 번째 변환을 적용하여 데이터를 놓을 수 있습니다 .(1,1)

z <- (x - min(x)) / (max(x) - min(x)) * 2 - 1
z <- z[-min(z)]
z <- z[-max(z)]
min(z); max(z)

마지막으로 역 쌍곡 탄젠트를 적용합니다 :

t <- atanh(z)
plot(density(t))

이제 데이터가 대략 정규 분포 된 것처럼 보입니다. 이것을 Fisher 변환이라고도합니다.


9
즉각적인 수학 문제를 해결했습니다. 하지만 통계 결과의 가능성이 가장 높은 소비자가 생각하는 쉽게 찾을 것이라고 생각하지 않는다 로 응답 스케일과 모델링에서는 어떤 오류 구조가 의미가 있는지 생각해야합니다. 스케일은 경험상 최소값과 최대 값에 민감합니다. atanh[(xmin(x))/(max(x)min(x))]
Nick Cox

2
@NickCox 당신은 절대적으로 맞습니다. OP가 문제에 대한 자세한 내용을 추가하면 다른 해결책을 찾을 수 있습니다.
stochazesthai

내 첫 코멘트의 내부 인수입니다 하지 변형되는 내용,하지만 내 의견의 정신은 내가 영향을받지 생각입니다.
Nick Cox

자세한 설명에 감사드립니다. @stochazesthai 감사하지만 내 데이터에는 코드를 적용 할 수 없습니다. 마지막에 원시 데이터 링크로 질문을 업데이트했습니다.
Darwin PC

진술 z <- z[-max(z)]z <- z[-min(z)]부적절하게 z단일 값으로 축소 됩니다. 또한 일반 함수 atanh(((x - min(x)) / (max(x) - min(x))))Inf의 최소값과 최대 값을 생성 x합니다.
Max Ghenis

-1

로그 스케일로 변환하려면 먼저 양수의 로그를 찾은 다음 부호를 곱하면 다음 코드에서이를 수행해야합니다.

transform_to_log_scale <- function(x){
    if(x==0){
        y <- 1
    } else {
        y <- (sign(x)) * (log(abs(x)))
    }
        y 
    }

위의 예를 사용하여 다음과 같은 기울어 진 분포를 그릴 수 있습니다.

x <- rlnorm(n = 1e2, meanlog = 0, sdlog = 1)
x <- x - 5
plot(density(x))

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

다음과 같이 변환 함수를 사용한 후 더 '정상적인'분포를 얻습니다.

plot(density(sapply(x,FUN=transform_logs_scale)))

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


3
(1) 대부분의 프로그래밍 언어 ( R포함)는 부호 함수 (음수의 경우 -1, 양수의 경우 1, 0의 경우 0)를 구현합니다. 그것을 사용하는 것이 더 표현적이고 빠릅니다. (2) 귀하의 제안은 그림과 같은 데이터를 분석하기에 좋지 않은 제안입니다. 왜냐하면 그것은 0에서 큰 불연속성을 갖기 때문입니다!
whuber

signum에 감사드립니다, 나는 그것에 대해 몰랐습니다. 어떻게 구현되는지 궁금합니다
yosemite_k

3
다양한 방법이 있습니다. 많은 프로세서 아키텍처에서 부호 비트는 많은 작업 후에 설정되므로 사용할 수 있습니다. IEEE 배정 밀도 부동 소수점 표현에서 부호는 단일 비트 (진정한 0에 대한 또 다른 빠른 테스트)를 검사하여 찾을 수 있습니다. 예측 분기 등이있는 파이프 라인 아키텍처에서는 가능한 경우 분기하지 않는 것이 훨씬 더 효율적이므로 내장 버전의 signum 을 사용하는 것이 계산상의 이득이 될 수 있습니다. 우연히y <- 1 때의 설정 은 임의적으로 보입니다. 통계 분석을 방해 할 수 있습니다. x=0
whuber
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.