Bagaimana saya harus mengubah data non-negatif termasuk nol?


191

Jika saya memiliki data positif yang sangat miring saya sering mengambil log. Tapi apa yang harus saya lakukan dengan data non-negatif yang sangat miring yang menyertakan nol? Saya telah melihat dua transformasi yang digunakan:

  • log(x+1) yang memiliki fitur rapi yang 0 peta ke 0.
  • log(x+c) mana c diperkirakan atau disetel menjadi nilai positif yang sangat kecil.

Apakah ada pendekatan lain? Adakah alasan bagus untuk memilih satu pendekatan daripada yang lain?


19
Saya telah merangkum beberapa jawaban ditambah beberapa bahan lain di robjhyndman.com/researchtips/transformations
Rob Hyndman

5
cara terbaik untuk mengubah dan mempromosikan stat.stackoverflow!
robin girard

Ya, saya setuju @robingirard (saya baru saja tiba di sini sekarang karena posting blog Rob)!
Ellie Kesselman

Lihat juga stats.stackexchange.com/questions/39042/… untuk aplikasi ke data yang disensor kiri (yang dapat dikarakterisasi, hingga pergeseran lokasi, persis seperti dalam pertanyaan ini).
whuber

2
Tampaknya aneh untuk bertanya tentang bagaimana mentransformasikannya tanpa menyatakan tujuan transformasi. Apa situasinya? Mengapa perlu transformasi? Jika kami tidak tahu apa yang ingin Anda capai, bagaimana orang bisa menyarankan sesuatu dengan wajar ? (Jelas seseorang tidak dapat berharap untuk berubah menjadi normalitas, karena keberadaan probabilitas nol untuk nol menunjukkan adanya lonjakan dalam distribusi pada nol, yang tidak akan dihapus oleh lonjakan transformasi - hanya dapat memindahkannya.)
Glen_b

Jawaban:


55

Bagi saya, pilihan transformasi yang paling tepat adalah bergantung pada model dan konteksnya.

Poin '0' dapat muncul dari beberapa alasan berbeda yang masing-masing mungkin harus diperlakukan secara berbeda:

  • Pemotongan (seperti dalam contoh Robin): Gunakan model yang sesuai (misalnya, campuran, model survival dll)
  • Data tidak ada: Data tidak sempurna / Jatuhkan pengamatan jika sesuai.
  • Titik nol alami (misalnya, tingkat pendapatan; orang yang menganggur memiliki penghasilan nol): Transformasikan sesuai kebutuhan
  • Sensitivitas alat ukur: Mungkin, menambah sedikit data?

Saya tidak benar-benar menawarkan jawaban karena saya curiga tidak ada transformasi universal yang 'benar' ketika Anda memiliki nol.


6
Setiap jawaban untuk pertanyaan saya telah memberikan informasi yang berguna dan saya telah memilih semuanya. Tapi saya hanya bisa memilih satu jawaban dan Srikant's memberikan ikhtisar IMO terbaik.
Rob Hyndman

2
Perhatikan juga bahwa ada model nol-meningkat (nol ekstra dan Anda peduli tentang beberapa nol: model campuran), dan model rintangan (nol dan Anda peduli tentang non-nol: model dua-tahap dengan model disensor awal).
Wayne

82

Tidak ada yang menyebutkan transformasi sinus hiperbolik terbalik. Jadi untuk kelengkapan saya menambahkannya di sini.

Ini adalah alternatif dari transformasi Box-Cox dan didefinisikan oleh mana . Untuk setiap nilai , nol peta ke nol. Ada juga versi dua parameter yang memungkinkan pergeseran, seperti halnya dengan transformasi BC dua parameter. Burbidge, Magee dan Robb (1988) membahas transformasi IHS termasuk estimasi .θ > 0 θ θ

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

Transformasi IHS bekerja dengan data yang didefinisikan pada seluruh garis nyata termasuk nilai negatif dan nol. Untuk nilai ia berperilaku seperti transformasi log, terlepas dari nilai (kecuali 0). Kasing pembatas seperti menghasilkan .θ θ 0 f ( y , θ ) yyθθ0f(y,θ)y

Bagi saya sepertinya transformasi IHS harus lebih dikenal daripada sebelumnya.


1
Sepertinya alternatif yang baik untuk transformasi / logistiktanh
Firebug

1
Tentang IHS, beberapa orang tampaknya tidak setuju: onlinelibrary.wiley.com/doi/10.1890/10-0340.1/abstract
kjetil b halvorsen

3
Makalah itu adalah tentang transformasi sinus terbalik, bukan sinus hiperbolik terbalik.
Bryan

42

Pendekatan yang berguna ketika variabel digunakan sebagai faktor independen dalam regresi adalah untuk menggantinya dengan dua variabel: satu adalah indikator biner apakah itu nol dan yang lainnya adalah nilai variabel asli atau ekspresi ulang itu, seperti logaritma-nya. Teknik ini dibahas dalam buku Hosmer & Lemeshow tentang regresi logistik (dan di tempat lain, saya yakin). Plot probabilitas terpotong dari bagian positif dari variabel asli berguna untuk mengidentifikasi ekspresi ulang yang sesuai. (Lihat analisis di https://stats.stackexchange.com/a/30749/919 untuk contoh.)

Ketika variabel adalah variabel dependen dalam model linier, regresi yang disensor (seperti Tobit ) dapat berguna, sekali lagi meniadakan kebutuhan untuk menghasilkan logaritma yang dimulai. Teknik ini umum di kalangan ahli ekonometrika.


1
Apakah memodelkan data sebagai Poisson tanpa inflasi merupakan kasus khusus dari pendekatan ini?
David LeBauer

4
@ David, meskipun tampaknya mirip, tidak, karena ZIP adalah model dari variabel dependen , bukan variabel independen.
Whuber

1
@whuber Teknik ini dibahas dalam buku Hosmer & Lemeshow tentang regresi logistik. Mungkinkah Anda tahu di bab mana mereka membahas teknik ini? Saya melihat buku mereka, tetapi sepertinya tidak dapat menemukan halaman yang tepat ...
landroni

1
@landroni H&L segar di benak saya saat itu, jadi saya merasa yakin ada sesuatu dalam buku itu yang terkait dengan topik ini. (Saya telah berkonsultasi dengannya untuk mengembangkan beberapa model regresi yang sangat besar dan banyak variabel independen harus diperlakukan dengan cara ini.) Namun, saya juga tidak dapat menemukan referensi pada titik ini. Saya telah menulis tentang teknik ini di posting berikutnya, jika Anda mencari detail. Dua yang muncul dalam pencarian situs adalah stats.stackexchange.com/questions/6563 dan stats.stackexchange.com/questions/4831 .
whuber

1
@ Landroni Ya, mereka setara, dengan cara yang sama bahwa semua pengkodean numerik dari variabel biner apa pun adalah setara. Pilih yang mana yang Anda rasa paling mudah untuk ditafsirkan.
whuber

37

Log transformasi dengan shift adalah kasus khusus dari transformasi Box-Cox :

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

λ

λ

λ=(0,1)λ

Di R, boxcox.fitfungsi dalam paket geoRakan menghitung parameter untuk Anda.


hmm, tidak bisa mendapatkan getah "begin case" untuk menerima baris baru. : - /
ars

@ars saya memperbaiki eqns untuk menggunakan kasus mulai. Saya harap saya tidak memotong masalah dalam proses.

1
@Rob: Oh, maaf. GeoR Diggle adalah cara untuk pergi - tetapi tentukan lambda2=TRUEdalam argumen untuk boxcox.fit. (Juga memperbarui jawabannya.)
ars

3
@ gd047: ini referensi yang bagus: elevatorlady.ca/doc/refcard/expressions.html
ars

6
Bagi siapa saja yang membaca ini bertanya-tanya apa yang terjadi pada fungsi ini, sekarang disebut boxcoxfit.
stragu

19

Saya berasumsi nol itu = data hilang, karena itu pertanyaan yang sama sekali berbeda.

Ketika berpikir tentang bagaimana menangani nol dalam regresi linier berganda, saya cenderung mempertimbangkan berapa banyak nol yang sebenarnya kita miliki?

Hanya beberapa nol

Jika saya memiliki nol tunggal dalam kumpulan data yang cukup besar, saya cenderung:

  1. Hapus intinya, ambil log, dan pas dengan model
  2. c

c

Anda bisa membuat prosedur ini sedikit kurang mentah dan menggunakan metode boxcox dengan perubahan yang dijelaskan dalam jawaban ars.

Sejumlah besar nol

Jika kumpulan data saya berisi sejumlah besar nol, maka ini menunjukkan bahwa regresi linier sederhana bukan alat terbaik untuk pekerjaan itu. Sebaliknya saya akan menggunakan sesuatu seperti pemodelan campuran (seperti yang disarankan oleh Srikant dan Robin).


15

Jika Anda menginginkan sesuatu yang cepat dan kotor mengapa tidak menggunakan akar kuadrat?


7
Dan seringkali transformasi root cube bekerja dengan baik, dan memungkinkan nol dan negatif. Saya telah menemukan root cube untuk bekerja dengan baik ketika, misalnya, pengukurannya adalah volume atau jumlah partikel per satuan volume. Root Cube akan mengubahnya menjadi dimensi linier. Pendekatan yang lebih fleksibel adalah mencocokkan spline kubik terbatas (spline alami) pada akar pangkat tiga atau akar kuadrat, memungkinkan sedikit penyimpangan dari bentuk yang diasumsikan.
Frank Harrell

2
+1. Untuk sedikit artikel tentang akar pangkat tiga, lihat stata-journal.com/article.html?article=st0223 (Ini akan menjadi .pdf gratis dari kuartal pertama 2014).
Nick Cox

2
Akar kuadrat dari nol, adalah nol, sehingga hanya nilai-nilai bukan nol yang ditransformasikan. Ini tidak ada hubungannya dengan lonjakan, jika nol meningkat, dan dapat menyebabkan masalah serius jika, dalam kelompok, masing-masing memiliki jumlah nol yang berbeda. Dengan kata lain, jika beberapa kelompok memiliki banyak nol dan yang lain memiliki sedikit, transformasi ini dapat mempengaruhi banyak hal secara negatif. Untuk grup dengan varian terbesar (juga memiliki angka nol paling kecil), hampir semua nilai diubah. Sebaliknya, mereka yang paling banyak nol, tidak banyak nilai yang ditransformasikan. Ini dapat mengubah grup mana yang memiliki varian terbesar.
D_Williams

Tidak ada transformasi yang akan mempertahankan varians dalam kasus yang dijelaskan oleh @D_Williams. Model campuran (disebutkan di tempat lain di utas ini) mungkin akan menjadi pendekatan yang baik dalam kasus itu.
mkt

10

Saya berasumsi Anda memiliki data kontinu.

Jika data termasuk nol, ini berarti Anda memiliki lonjakan nol yang mungkin disebabkan oleh beberapa aspek tertentu dari data Anda. Tampaknya misalnya dalam energi angin, angin di bawah 2 m / s menghasilkan daya nol (disebut cut in) dan angin di atas (sekitar) 25 m / s juga menghasilkan daya nol (untuk alasan keamanan, disebut terputus) . Sementara distribusi energi angin yang dihasilkan tampaknya berkelanjutan, ada lonjakan nol.

Solusi saya: Dalam hal ini, saya sarankan untuk memperlakukan nol secara terpisah dengan bekerja dengan campuran lonjakan nol dan model yang Anda rencanakan untuk digunakan pada bagian distribusi yang kontinu (wres Lebesgue).


9

Membandingkan jawaban yang disediakan oleh @RobHyndman ke transformasi log-plus-one diperluas ke nilai negatif dengan bentuk:

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

masukkan deskripsi gambar di sini


θx=0


8

Karena dua parameter yang cocok dengan Box-Cox telah diusulkan, berikut ini beberapa R agar sesuai dengan data input, jalankan fungsi sewenang-wenang di dalamnya (mis. Peramalan time series), dan kemudian kembalikan output yang dibalik:

# 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

Misalkan Y adalah jumlah uang yang dihabiskan setiap orang Amerika pada mobil baru di tahun tertentu (total harga pembelian). Y akan melonjak pada 0; tidak akan memiliki nilai sama sekali antara 0 dan sekitar 12.000; dan akan mengambil nilai-nilai lain sebagian besar pada remaja, dua puluhan dan tiga puluhan ribu. Prediktor akan menjadi proksi untuk tingkat kebutuhan dan / atau minat dalam melakukan pembelian semacam itu. Kebutuhan atau minat tidak bisa dikatakan nol untuk individu yang tidak melakukan pembelian; pada skala ini non-pembeli akan jauh lebih dekat dengan pembeli daripada Y atau bahkan log Y akan menyarankan. Dalam kasus seperti ini tetapi dalam perawatan kesehatan, saya menemukan bahwa prediksi yang paling akurat, dinilai dengan uji-set / pelatihan-set crossvalidation, diperoleh oleh, dalam urutan yang meningkat,

  1. Regresi logistik pada versi biner Y,
  2. OLS di Y,
  3. Regresi ordinal (PLUM) pada Y digabungkan ke dalam 5 kategori (sehingga dapat membagi pembeli menjadi 4 kelompok dengan ukuran yang sama),
  4. Regresi logistik multinomial pada Y dimasukkan ke dalam 5 kategori,
  5. OLS pada log (10) Y (saya tidak berpikir untuk mencoba root cube), dan
  6. OLS pada Y dimasukkan ke dalam 5 kategori.

Beberapa akan mundur pada kategorisasi variabel dependen berkelanjutan ini. Tetapi meskipun itu mengorbankan beberapa informasi, pengelompokan nampaknya membantu dengan mengembalikan aspek mendasar yang mendasar dari situasi - sekali lagi, bahwa "nol" jauh lebih mirip dengan yang lain daripada yang akan ditunjukkan oleh Y.


4
Anda juga dapat membaginya menjadi dua model: probabilitas membeli mobil (respons biner), dan nilai mobil yang diberikan pembelian. Ini adalah praktik standar di banyak bidang, misalnya asuransi, risiko kredit, dll.
Hong Ooi

1
@HongOoi - dapatkah Anda menyarankan pembacaan tentang kapan pendekatan ini dan tidak berlaku?
rolando2

4

Transformasi daya Yeo-Johnson yang dibahas di sini memiliki sifat-sifat luar biasa yang dirancang untuk menangani nol dan negatif sambil membangun kekuatan transformasi daya Box Cox. Inilah yang biasanya saya tuju ketika saya berhadapan dengan nol atau data negatif.

Berikut ini adalah ringkasan transformasi dengan pro / kontra untuk menggambarkan mengapa Yeo-Johnson lebih disukai.

Catatan

Pro: Baik dengan data positif.

Cons: Tidak menangani nol.

> log(0)
[1] -Inf

Log Plus 1

Kelebihan: Offset plus 1 menambahkan kemampuan untuk menangani nol di samping data positif.

Cons: Gagal dengan data negatif

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

Akar pangkat dua

Kelebihan: Menggunakan transformasi daya yang dapat menangani nol dan data positif.

Cons: Gagal dengan data negatif

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

Kotak Cox

Kode R:

box_cox <- function(x, lambda) {

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

}

Pro: Mengaktifkan transformasi daya berskala

Cons: Menderita masalah dengan nol dan negatif (yaitu hanya dapat menangani data positif.

> 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

Kode 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)

}

Kelebihan: Dapat menangani data positif, nol, dan negatif.

Cons: Tidak ada yang bisa saya pikirkan. Properti sangat mirip dengan Box-Cox tetapi dapat menangani data nol dan negatif.

> 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
Kontra untuk Yeo-Johnson: transformasi kompleks dan terpisah untuk positif dan negatif dan untuk nilai di kedua sisi lambda, nilai penyetelan magis (epsilon; dan apa itu lambda?). Tidak ada keuntungan nyata dibandingkan dengan transformasi log negatif-diperpanjang sederhana yang ditunjukkan dalam jawaban Firebug, kecuali Anda memerlukan transformasi daya skala (seperti dalam Kotak-Cox).
Konrad Rudolph

1

Untuk memperjelas cara menangani log nol dalam model regresi, kami telah menulis makalah pedagogis yang menjelaskan solusi terbaik dan kesalahan umum yang dilakukan orang dalam praktik. Kami juga mengeluarkan solusi baru untuk mengatasi masalah ini.

Anda dapat menemukan kertas dengan mengklik di sini: https://ssrn.com/abstract=3444996

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

YY+c>0

Dalam artikel kami, kami benar-benar memberikan contoh di mana menambahkan konstanta yang sangat kecil sebenarnya memberikan bias tertinggi. Kami memberikan turunan ekspresi bias.

Sebenarnya, Poisson Pseudo Maximum Likelihood (PPML) dapat dianggap sebagai solusi yang baik untuk masalah ini. Kita harus mempertimbangkan proses berikut:

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

Kami menunjukkan bahwa penaksir ini tidak bias dan hanya dapat diperkirakan dengan GMM dengan perangkat lunak statistik standar apa pun. Misalnya, dapat diperkirakan dengan mengeksekusi hanya satu baris kode dengan Stata.

Kami harap artikel ini dapat membantu dan kami ingin mendapat umpan balik dari Anda.

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.