Cara menghindari log (0) istilah dalam regresi


10

Saya telah mengikuti vektor X dan Y sederhana:

> X
[1] 1.000 0.063 0.031 0.012 0.005 0.000
> Y
[1] 1.000 1.000 1.000 0.961 0.884 0.000
> 
> plot(X,Y)

masukkan deskripsi gambar di sini

Saya ingin melakukan regresi menggunakan log X. Untuk menghindari log (0), saya mencoba untuk memberi +1 atau +0.1 atau +0.00001 atau +0.000000000000001:

> summary(lm(Y~log(X)))
Error in lm.fit(x, y, offset = offset, singular.ok = singular.ok, ...) : 
  NA/NaN/Inf in 'x'
> summary(lm(Y~log(1+X)))

Call:
lm(formula = Y ~ log(1 + X))

Residuals:
       1        2        3        4        5        6 
-0.03429  0.22189  0.23428  0.20282  0.12864 -0.75334 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)  
(Intercept)   0.7533     0.1976   3.812   0.0189 *
log(1 + X)    0.4053     0.6949   0.583   0.5910  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

Residual standard error: 0.4273 on 4 degrees of freedom
Multiple R-squared:  0.07838,   Adjusted R-squared:  -0.152 
F-statistic: 0.3402 on 1 and 4 DF,  p-value: 0.591

> summary(lm(Y~log(0.1+X)))

Call:
lm(formula = Y ~ log(0.1 + X))

Residuals:
       1        2        3        4        5        6 
-0.08099  0.20207  0.23447  0.21870  0.15126 -0.72550 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)  
(Intercept)    1.0669     0.3941   2.707   0.0537 .
log(0.1 + X)   0.1482     0.2030   0.730   0.5058  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

Residual standard error: 0.4182 on 4 degrees of freedom
Multiple R-squared:  0.1176,    Adjusted R-squared:  -0.103 
F-statistic: 0.5331 on 1 and 4 DF,  p-value: 0.5058

> summary(lm(Y~log(0.00001+X)))

Call:
lm(formula = Y ~ log(1e-05 + X))

Residuals:
       1        2        3        4        5        6 
-0.24072  0.02087  0.08796  0.13872  0.14445 -0.15128 

Coefficients:
               Estimate Std. Error t value Pr(>|t|)    
(Intercept)     1.24072    0.12046  10.300 0.000501 ***
log(1e-05 + X)  0.09463    0.02087   4.534 0.010547 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

Residual standard error: 0.1797 on 4 degrees of freedom
Multiple R-squared:  0.8371,    Adjusted R-squared:  0.7964 
F-statistic: 20.56 on 1 and 4 DF,  p-value: 0.01055

> 
> summary(lm(Y~log(0.000000000000001+X)))

Call:
lm(formula = Y ~ log(1e-15 + X))

Residuals:
        1         2         3         4         5         6 
-0.065506  0.019244  0.040983  0.031077 -0.019085 -0.006714 

Coefficients:
               Estimate Std. Error t value Pr(>|t|)    
(Intercept)     1.06551    0.02202   48.38 1.09e-06 ***
log(1e-15 + X)  0.03066    0.00152   20.17 3.57e-05 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

Residual standard error: 0.04392 on 4 degrees of freedom
Multiple R-squared:  0.9903,    Adjusted R-squared:  0.9878 
F-statistic: 406.9 on 1 and 4 DF,  p-value: 3.565e-05

Outputnya berbeda dalam semua kasus. Apa nilai yang benar untuk menghindari log (0) dalam regresi? Apa metode yang tepat untuk situasi seperti itu.

Sunting: tujuan utama saya adalah untuk meningkatkan prediksi model regresi dengan menambahkan istilah log, yaitu: lm (Y ~ X + log (X))


4
log(x)log(x+c)log(x)

Saya ingin meningkatkan prediksi model regresi dengan menggunakan lm (Y ~ X + log (X)). Untuk ini, apa yang akan menjadi rekomendasi Anda untuk menghindari log (0)?
rnso

5
Anda tidak dapat memiliki log (X) di sana; Anda sudah menetapkan itu. Jadi apa yang sebenarnya ingin Anda capai? Mengingat Anda tidak dapat mengambil log (0), apa yang ingin Anda dapatkan dari regresi? Mengapa Anda ingin log (X) di sana? Apa yang bisa Anda toleransi daripada memiliki log (X) di sana?
Glen_b -Reinstate Monica

3
Apa sains di sini? Itu harus menjadi panduan untuk apa yang harus dilakukan.
Nick Cox

1
juga saya tidak melihat apa pun di sana yang membahas masalah yang saya ajukan (atau yang lebih penting, yang diangkat oleh Nick Cox), atau pun apa pun yang akan memandu jawaban atas pertanyaan di sini.
Glen_b -Reinstate Monica

Jawaban:


8

Semakin kecil konstanta yang Anda tambahkan semakin besar outlier adalah bahwa Anda akan membuat: masukkan deskripsi gambar di sini

Jadi sulit untuk membenarkan konstanta di sini. Anda dapat mempertimbangkan transformasi yang tidak memiliki masalah dengan 0s, misalnya polinomial urutan ketiga.


Apakah x + x ^ 2 + x ^ 3 setara dengan log (x)? Silakan lihat komentar saya di jawaban lain untuk alasan saya mencoba menggunakan nilai log.
rnso

2
Mereka tidak setara tetapi alternatif.
Maarten Buis

10

Mengapa Anda ingin memplot logaritma? Apa yang salah dengan memplot variabel seperti apa adanya?

Salah satu alasan untuk bekerja dengan log adalah ketika distribusi menghasilkan diasumsikan log-normal, misalnya.

Yang lain adalah bahwa angka-angka mewakili parameter skala atau digunakan secara multiplikasi, dalam hal ini ruang di mana mereka berada secara alami logaritmik (untuk alasan yang sama bahwa Jeffrey sebelum variabel skala adalah logaritmik).

Tak satu pun dari ini yang terjadi. Saya pikir jawaban yang tepat di sini adalah jangan lakukan itu. Pertama datang dengan model penghasil data, dan kemudian gunakan data Anda dengan cara yang konsisten dengan itu.

yxylogx

Mungkin satu-satunya hal yang akan Anda dapatkan dengan terus menambahkan fungsi input adalah model yang dilengkapi berlebihan. Jika Anda menginginkan model yang benar-benar valid, Anda perlu membuat tebakan yang baik dan memiliki cukup data untuk mempelajari suatu model. Semakin banyak tebakan yang Anda buat, semakin banyak parameter yang Anda miliki, semakin banyak data yang Anda butuhkan.


Saya tidak ingin memplot log. Saya ingin menggunakan variabel X dalam regresi. Untuk mendapatkan yang paling pas, saya kira kita harus memasukkan log dan juga polinomial. Untuk itu saya perlu nilai log.
rnso

@ rnso: Jadi, Anda membayangkan bahwa nilai target adalah produk dari input ini? Sangat aneh untuk nilai target terkait dengan input secara multiplikasi ketika inputnya bisa nol.
Neil G

Bukan produk tetapi jumlah. Saya mencoba menggunakan rumus: lm (Y ~ X + log (X))
rnso

1
eyxiwixi

1
Anda menghilangkan istilah log. Anda sudah memiliki koefisien dari istilah log: Not a Number
Caleth

3

Sulit untuk mengatakan dengan begitu sedikit perincian tentang data Anda dan hanya enam pengamatan, tetapi mungkin masalah Anda terletak pada variabel Y Anda (dibatasi antara nol dan satu) dan bukan pada X Anda. Lihatlah pendekatan berikut ini menggunakan dua parameter fungsi log-logistik dari paket drc :

X<-c(1.000, 0.063, 0.031, 0.012, 0.005, 0.000)
Y<-c(1.000, 1.000, 1.000, 0.961, 0.884, 0.000)

library(drc)
mod1<-drm(Y ~ X, fct=LL.2())
summary(mod1)

#Model fitted: Log-logistic (ED50 as parameter) with lower limit at 0 and upper limit at 1 (2 parms)
#
#Parameter estimates:
#  
#  Estimate  Std. Error     t-value p-value
#b:(Intercept) -1.5131e+00  1.4894e-01 -1.0159e+01  0.0005
#e:(Intercept)  1.3134e-03  1.8925e-04  6.9401e+00  0.0023
#
#Residual standard error:
#  
#  0.005071738 (4 degrees of freedom)  

plot(X,Y)
lines(seq(0, 1, 0.001), predict(mod1, data.frame(X=seq(0, 1, 0.001))))

masukkan deskripsi gambar di sini


1

Melihat plot y vs x, bentuk fungsional tampaknya y = 1 - exp (-alpha x), dengan alfa yang sangat tinggi. Ini dekat dengan tetapi tidak cukup fungsi langkah dan Anda akan membutuhkan sejumlah besar polinomial agar sesuai dengan data ini (pikirkan dalam hal exp (x) = 1 + x + x ^ 2/2! +. + X ^ n / n! + ...). Menyusun ulang istilah, kita mendapatkan exp (-alpha x) = 1-y. Jika Anda mengambil log sekarang, ini memberikan -alpha x = log (1-y). Anda bisa mendefinisikan variabel baru z = log (1-y) dan mencoba menemukan alpha yang paling cocok dengan data. Anda masih memiliki masalah tentang bagaimana menangani y = 1. Saya tidak tahu konteks masalah Anda, tetapi kesan saya adalah bahwa Anda harus berpikir tentang Anda mendekati 1 secara asimptot sebagai x mendekati 1 dan tetapi Anda tidak pernah benar-benar mencapai 1.

Memikirkan hal ini lagi, saya ingin tahu apakah data sebenarnya dari distribusi Weibull y = 1 - exp (-alpha x ^ beta). Menyusun ulang istilah, kita mendapatkan beta log (x) = log (-log (1-y)) - log (alpha) dan kita bisa menggunakan OLS untuk mendapatkan alpha dan beta. Masalah penanganan y = 1 tetap ada.


Terima kasih. Analisis yang bagus.
rnso
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.