Bagaimana mengubah nilai negatif menjadi logaritma?

12

Saya ingin tahu cara mengubah nilai negatif Log(), karena saya memiliki data heteroskedastik. Saya membaca bahwa itu bekerja dengan rumus Log(x+1)tetapi ini tidak bekerja dengan database saya dan saya terus mendapatkan NaNs sebagai hasilnya. Misalnya saya mendapatkan pesan Peringatan ini (saya tidak memasukkan database lengkap saya karena saya pikir dengan salah satu nilai negatif saya sudah cukup untuk menunjukkan contoh):

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

Terima kasih sebelumnya

MEMPERBARUI:

Ini adalah histogram dari data saya. Saya bekerja dengan deret waktu palaeontologis pengukuran kimia, Misalnya perbedaan antara variabel seperti Ca dan Zn terlalu besar, maka saya perlu beberapa jenis standardisasi data, itulah sebabnya saya menguji log()fungsi. masukkan deskripsi gambar di sini

Ini adalah data mentah saya

Darwin PC
sumber
2
Logaritma hanya didefinisikan untuk bilangan positif, dan biasanya digunakan sebagai transformasi statistik pada data positif sehingga model akan mempertahankan positivitas ini. Kehendak log(x+1)transformasi hanya didefinisikan x > -1, karena kemudian x + 1positif. Akan lebih baik untuk mengetahui alasan Anda ingin log mengubah data Anda.
Matthew Drury
3
Beri tahu kami lebih banyak tentang data, termasuk rentang, rata-rata, frekuensi nilai negatif, nol, dan positif. Bisa jadi model linear umum dengan tautan log paling masuk akal untuk data selama masuk akal untuk berpikir bahwa respons rata-rata adalah positif. Bisa jadi Anda tidak perlu mentransformasikannya sama sekali.
Nick Cox
6
Terima kasih telah menambahkan detail. Untuk data seperti 0 memiliki arti (persamaan!) Yang harus dihormati, memang dilestarikan . Untuk itu dan alasan lain saya akan menggunakan akar pangkat tiga. Dalam praktiknya, Anda akan memerlukan beberapa variasi sign(x) * (abs(x))^(1/3), detail tergantung pada sintaksis perangkat lunak. Untuk informasi lebih lanjut tentang akar pangkat tiga, lihat misalnya stata-journal.com/sjpdf.html?articlenum=st0223 (lihat esp. Hlm.152-3). Kami menggunakan akar pangkat tiga untuk membantu visualisasi variabel respons yang sifatnya
Nick Cox
8
Mengapa Anda tidak mengubah variabel asli alih-alih perbedaan?
whuber
4
Anda memecahkan masalah matematika. @ whuber's saran atau akar kubus masih, saya pikir, akan lebih mudah untuk dikerjakan, terutama jika konstanta adalah murni empiris atau bervariasi antar variabel. Aturan yang baik untuk pilihan transformasi hanya menggunakan transformasi yang akan bekerja untuk data serupa yang dapat Anda bayangkan. Jadi "berfungsi" untuk tetapi akan gagal jika batch Anda berikutnya dibatasi oleh ..x > - 4 - 5log(x+4)x>45
Nick Cox

Jawaban:

14

Karena logaritma hanya didefinisikan untuk angka positif, Anda tidak dapat mengambil logaritma nilai negatif. Namun, jika Anda bertujuan mendapatkan distribusi yang lebih baik untuk data Anda, Anda dapat menerapkan transformasi berikut.

Misalkan Anda memiliki data negatif miring:

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

maka Anda dapat menerapkan transformasi pertama untuk membuat data Anda berada di :(1,1)

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

dan akhirnya menerapkan tangen hiperbolik terbalik:

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

Sekarang, data Anda terlihat berdistribusi normal. Ini juga disebut transformasi Fisher.

stochazesthai
sumber
9
Anda memecahkan masalah matematika langsung. Tapi saya tidak berpikir konsumen kemungkinan besar hasil statistik akan merasa mudah untuk berpikir tentang sebagai skala respons dan dalam pemodelan Anda perlu memikirkan struktur kesalahan apa yang masuk akal. Skala tersebut akan peka terhadap minimum dan maksimum empiris. atanh[(xmin(x))/(max(x)min(x))]
Nick Cox
2
@NickCox Anda benar sekali. Mungkin jika OP menambahkan lebih banyak detail tentang masalahnya, kita bisa mencari solusi alternatif!
stochazesthai
Argumen internal dalam komentar pertama saya bukanlah apa yang sedang diubah, tetapi semangat komentar saya adalah saya pikir tidak terpengaruh.
Nick Cox
Terima kasih @stochazesthai atas penjelasan terperinci Anda, tetapi saya tidak dapat menerapkan kode Anda ke data saya. Saya memperbarui pertanyaan saya dengan tautan data mentah saya di bagian akhir.
Darwin PC
Pernyataan z <- z[-max(z)]dan z <- z[-min(z)]menyusut secara tidak tepat zke nilai tunggal. Juga fungsi umum atanh(((x - min(x)) / (max(x) - min(x))))menghasilkan Infuntuk nilai minimum dan maksimum x.
Max Ghenis
-1

Untuk mengubahnya menjadi skala log, pertama-tama cari log dari angka positif lalu kalikan dengan tandanya, kode berikut harus melakukannya.

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

Dengan menggunakan contoh di atas kita dapat memplot distribusi miring berikut ini

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

masukkan deskripsi gambar di sini

Setelah menggunakan fungsi transformasi sebagai berikut, kami mendapatkan distribusi yang terlihat lebih 'normal'

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

masukkan deskripsi gambar di sini

yosemite_k
sumber
3
(1) Sebagian besar bahasa pemrograman ( Rtermasuk) mengimplementasikan fungsi signum (yang mengembalikan -1 untuk angka negatif, 1 untuk angka positif dan 0 untuk nol). Menggunakannya akan lebih ekspresif dan lebih cepat. (2) Proposal Anda adalah miskin untuk menganalisis data seperti yang diilustrasikan, karena memiliki diskontinuitas besar di nol!
whuber
terima kasih untuk signum, saya tidak tahu tentang itu, bertanya-tanya bagaimana ini diterapkan
yosemite_k
3
Ada berbagai cara. Dalam banyak arsitektur prosesor, bit tanda ditetapkan setelah banyak operasi, sehingga dapat digunakan. Dalam representasi floating point presisi ganda IEEE, tanda dapat ditemukan dengan memeriksa bit tunggal (ditambah tes cepat lain untuk nol benar). Dalam arsitektur pipelined dengan percabangan prediktif, dll., Biasanya jauh lebih efisien untuk tidak bercabang jika memungkinkan, itulah sebabnya menggunakan versi built-in dari signum dapat menjadi keuntungan komputasi yang signifikan. Kebetulan, pengaturan y <- 1ketika terlihat sewenang-wenang - itu benar-benar dapat mengacaukan analisis statistik. x=0
whuber