Come evitare il log (0) termine nella regressione


10

Ho i seguenti semplici vettori X e Y:

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

inserisci qui la descrizione dell'immagine

Voglio fare la regressione usando il registro di X. Per evitare di ottenere il registro (0), provo a inserire +1 o +0.1 o +0.00001 o +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

L'output è diverso in tutti i casi. Qual è il valore corretto da mettere per evitare il registro (0) nella regressione? Qual è il metodo corretto per tali situazioni.

Modifica: il mio obiettivo principale è migliorare la previsione del modello di regressione aggiungendo il termine log, ovvero: lm (Y ~ X + log (X))


4
log(X)log(X+c)log(X)

Voglio migliorare la previsione del modello di regressione usando lm (Y ~ X + log (X)). Per questo quale sarebbe la tua raccomandazione per evitare il registro (0)?
anche

5
Non puoi avere log (X) lì; l'hai già stabilito. Quindi cosa stai effettivamente cercando di ottenere? Dato che non puoi prendere il registro (0), cosa vuoi uscire dalla regressione? Perché vuoi accedere (X) lì? Cosa puoi tollerare invece di avere log (X) lì dentro?
Glen_b

3
Qual è la scienza qui? Dovrebbe essere una guida su cosa fare.
Nick Cox,

1
Inoltre, non vedo nulla lì che affronti i problemi che sollevo (o, cosa più importante, quello che Nick Cox ha sollevato), né effettivamente nulla che possa guidare una risposta alla domanda qui.
Glen_b

Risposte:


8

Più piccola è la costante che aggiungi più grande è il valore anomalo che creerai: inserisci qui la descrizione dell'immagine

Quindi è difficile giustificare una costante qui. Potresti considerare una trasformazione che non ha alcun problema con 0s, ad esempio un polinomio di terzo ordine.


X + x ^ 2 + x ^ 3 è equivalente a log (x)? Si prega di vedere i miei commenti in un'altra risposta per il motivo per cui sto cercando di utilizzare i valori di registro.
anche

2
Non sono equivalenti ma alternative.
Maarten Buis,

10

Perché vuoi tracciare i logaritmi? Cosa c'è di sbagliato nel tracciare le variabili così come sono?

Un motivo per lavorare con i log è quando, ad esempio, una distribuzione generata presunta è log-normale.

Un altro sarebbe che i numeri rappresentano parametri di scala o vengono utilizzati in modo moltiplicativo, nel qual caso lo spazio in cui si trovano è naturalmente logaritmico (per lo stesso motivo per cui il precedente di Jeffreys di una variabile di scala è logaritmico).

Nessuno di questi è il caso. Penso che la risposta giusta qui sia non farlo. In primo luogo elaborare un modello di generazione dei dati, quindi utilizzare i dati in modo coerente.

yXylogX

Probabilmente l'unica cosa che otterrai aggiungendo continuamente funzioni agli input è un modello sovradimensionato. Se si desidera un modello che convalida effettivamente, è necessario fare delle ipotesi valide e disporre di dati sufficienti per apprendere un modello. Più congetture fai, più parametri avrai, più dati avrai bisogno.


Non voglio tracciare i log. Voglio usare la variabile X in regressione. Per essere in forma, presumo che dovremmo includere il registro e anche i polinomi. Per questo ho bisogno di valori di registro.
anche

@rnso: Quindi stai immaginando che il valore target sia un prodotto di questi input? È molto strano che il valore target sia correlato in modo moltiplicativo agli ingressi quando l'ingresso può essere zero.
Neil G,

Non prodotto ma somma. Sto cercando di usare la formula: lm (Y ~ X + log (X))
anche

1
ey~ΠXiowioXio

1
si omette il termine log. Hai già il coefficiente del termine log: Not a Number
Caleth,

3

È difficile dirlo con così pochi dettagli sui tuoi dati e solo sei osservazioni, ma forse il tuo problema sta nella tua variabile Y (limitata tra zero e uno) e non nella tua X. Dai un'occhiata al seguente approccio usando il parametro due funzione log-logistica dal pacchetto 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))))

inserisci qui la descrizione dell'immagine


1

Guardando la trama di y vs x, la forma funzionale sembra essere y = 1 - exp (-alpha x), con un alfa molto alto. Questa funzione è vicina ma non del tutto graduale e avrai bisogno di un gran numero di polinomi per adattarsi a questi dati (pensa in termini di exp (x) = 1 + x + x ^ 2/2! +. + X ^ n / n! + ...). Riorganizzando i termini, otteniamo exp (-alpha x) = 1-y. Se prendi i log ora, questo dà -alpha x = log (1-y). È possibile definire una nuova variabile z = log (1-y) e provare a trovare l'alfa che si adatta meglio ai dati. Hai ancora il problema di come gestire y = 1. Non conosco il contesto del tuo problema, ma la mia impressione è che dovresti pensare a y che si avvicina asintoticamente 1 mentre x si avvicina a 1 e che in realtà non raggiunge mai 1.

Ripensandoci ancora, mi chiedo se i dati provengano effettivamente da una distribuzione di Weibull y = 1 - exp (-alpha x ^ beta). Riorganizzando i termini, otteniamo beta log (x) = log (-log (1-y)) - log (alpha) e possiamo usare OLS per ottenere alpha e beta. Resta il problema della gestione di y = 1.


Grazie. Buona analisi.
anche il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.