Negatif değerleri logaritmalara nasıl dönüştürebilirim?


12

Log()Heteroskedastik verilerim olduğu için negatif değerlerin nasıl dönüştürüleceğini bilmek istiyorum . Formül ile çalıştığını okudum Log(x+1)ama bu veritabanımla çalışmıyor ve sonuç olarak NaN'leri almaya devam ediyorum. Örneğin, bu Uyarı iletisini alıyorum (Negatif değerlerimden biriyle bir örnek göstermek için yeterli olduğunu düşündüğümden tam veritabanımı koymadım):

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

Şimdiden teşekkürler

GÜNCELLEME:

İşte verilerimin bir histogramı. Kimyasal ölçümlerin paleontolojik zaman serisi ile çalışıyorum, örneğin Ca ve Zn gibi değişkenler arasındaki fark çok büyük, o zaman veri standardizasyonunun bir türüne ihtiyacım var, bu yüzden log()işlevi test ediyorum . resim açıklamasını buraya girin

Bu benim ham verilerim


2
Logaritma sadece pozitif sayılar için tanımlanır ve genellikle pozitif veriler üzerinde istatistiksel bir dönüşüm olarak kullanılır, böylece bir model bu pozitifliği koruyacaktır. log(x+1)Dönüşümü yalnızca için tanımlandığı olacak x > -1daha sonra da, x + 1pozitiftir. Verilerinizi dönüştürmek için oturum açma nedeninizi bilmek iyi olur.
Matthew Drury

3
Negatif, sıfır ve pozitif değerlerin aralığı, ortalaması, frekansları dahil olmak üzere veriler hakkında daha fazla bilgi verin. Günlük bağlantısına sahip genelleştirilmiş doğrusal bir model, ortalama yanıtın pozitif olduğunu düşünmenin makul olduğu sürece veriler için en mantıklı olabilir. Hiç dönüşüm geçirmemelisiniz.
Nick Cox

6
Ayrıntı eklediğiniz için teşekkürler. Bu tür veriler için 0'ın gerçekten korunması gereken, saygı duyulması gereken bir anlamı (eşitlik!) Vardır . Bu ve diğer nedenlerden dolayı küp kökleri kullanırım. Uygulamada, sign(x) * (abs(x))^(1/3)yazılım sözdizimine bağlı olarak ayrıntılarda biraz değişiklik yapmanız gerekecektir . Küp kökleri üzerinde daha örn bkz İçin stata-journal.com/sjpdf.html?articlenum=st0223 (özellikle bkz. Pp.152-3) .Biz kullanılan küp köklerini pozitif ve negatif olabilir bir yanıt değişkenin yardım görselleştirme için doğa .com / doğa / günlük / v500 / n7464 / full /…
Nick Cox

8
Neden farklılıklar yerine orijinal değişkenleri dönüştürmüyorsunuz ?
whuber

4
Matematiksel problemi çözdünüz. @ whuber'ın önerisi veya küp kökleri, özellikle sabit tamamen ampirikse veya değişkenler arasında değişiyorsa, çalışmak daha kolay olurdu. Dönüşüm seçimi için iyi bir kural, yalnızca hayal edebileceğiniz benzer veriler için işe yarayacak dönüşümleri kullanmaktır. Böylece için "çalışır" ama bir sonraki partiniz ile sınırlanmışsa başarısız olur ..x > - 4 - 5log(x+4)x>45
Nick Cox

Yanıtlar:


14

Logaritma yalnızca pozitif sayılar için tanımlandığından, negatif değerlerin logaritmasını alamazsınız. Ancak, verileriniz için daha iyi bir dağıtım almayı hedefliyorsanız, aşağıdaki dönüşümü uygulayabilirsiniz.

Diyelim ki negatif verilerinizi eğittiniz:

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

verilerinizin içinde yatmasını sağlamak için ilk dönüşümü uygulayabilirsiniz :(1,1)

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

ve son olarak ters hiperbolik tanjant uygulayın:

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

Şimdi, verileriniz yaklaşık olarak normal şekilde dağılmış görünüyor. Buna Fisher dönüşümü de denir.


9
Hemen matematiksel problemi çözdünüz. Ama istatistiki sonuçların en olası tüketiciler düşünmek kolay bulmak sanmıyorum olarak bir yanıt ölçeği ve modellemede hata yapısının ne anlam ifade ettiğini düşünmeniz gerekir. Ölçek ampirik minimum ve maksimum değerlere duyarlı olacaktır. atanh[(xmin(x))/(max(x)min(x))]
Nick Cox

2
@NickCox Kesinlikle haklısın. Belki OP sorunu hakkında daha fazla ayrıntı eklerse, alternatif bir çözüm bulabiliriz!
stochazesthai

İlk yorumunda iç argümanı olduğunu değil dönüştürülmekte olan ne, ama benim yorumun ruhu ben etkilenmez düşünüyorum.
Nick Cox

Sayın @stochazesthai Ayrıntılı açıklamanız için teşekkürler, ancak kodumu verilerime uygulayamıyorum. Sonunda ham verilerimin bir bağlantısıyla sorumu güncelledim.
Darwin PC

İfadeler z <- z[-max(z)]ve z <- z[-min(z)]uygunsuz zbir şekilde tek bir değere küçülür . Ayrıca genel fonksiyon minimum ve maksimum değerlerini atanh(((x - min(x)) / (max(x) - min(x))))üretir . Infx
Max Ghenis

-1

Bir günlük ölçeğine dönüştürmek için, önce pozitif sayının günlüğünü bulun, ardından işaretiyle çarpın, aşağıdaki kod bunu yapmalıdır.

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

Yukarıdaki örneği kullanarak aşağıdaki çarpık dağılımı çizebiliriz

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

resim açıklamasını buraya girin

Dönüştürme işlevini aşağıdaki gibi kullandıktan sonra, daha 'normal' görünen bir dağılım elde ederiz

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

resim açıklamasını buraya girin


3
(1) Çoğu programlama dili ( Rdahil) signum fonksiyonunu uygular (negatif sayılar için -1, pozitif sayılar için 1 ve sıfır için 0 döndürür). Kullanmak daha etkileyici ve daha hızlı olurdu. (2) Teklifiniz, gösterilenler gibi verileri analiz etmek için fakirdir, çünkü sıfırda büyük bir süreksizlik vardır!
whuber

signum için teşekkürler, bunu bilmiyordum, nasıl uygulandığını merak ediyorum
yosemite_k

3
Çeşitli yollar var. Birçok işlemci mimarisinde birçok işlemden sonra bir işaret biti ayarlanır, böylece kullanılabilir. IEEE çift kesinlikli kayar nokta gösteriminde, işaret tek bir bit (artı gerçek bir sıfır için başka bir hızlı test) incelenerek bulunabilir. Vb öngörü dallanma ile boruhatlı mimarileri, bu yerleşik sürümü kullanılarak neden olan, genellikle çok daha verimli değil dalına eğer mümkünse var sinyalnum olabilir önemli hesaplama kazancı. Bu arada, ayar y <- 1yaparken görünüyor keyfi - gerçekten bir istatistiksel analiz mahveder. x=0
whuber
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.