Cómo evitar el término log (0) en regresión

10

Tengo los siguientes vectores X e Y simples:

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

ingrese la descripción de la imagen aquí

Quiero hacer una regresión usando el registro de X. Para evitar obtener el registro (0), trato de poner +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

La salida es diferente en todos los casos. ¿Cuál es el valor correcto para evitar log (0) en la regresión? ¿Cuál es el método correcto para tales situaciones?

Editar: mi objetivo principal es mejorar la predicción del modelo de regresión agregando el término log, es decir: lm (Y ~ X + log (X))

rnso
fuente
44
Ninguno de ellos es , todos son , por lo que cualquier noción de 'corrección' no tiene sentido. Ninguno de ellos es 'correcto' para . Para elegir entre ellos, tendría que decir más sobre qué propiedades desea y qué propiedades está dispuesto a renunciar. ¿Qué estás tratando de lograr realmente? log ( x + c ) log ( x )log(x)log(x+c)log(x)
Glen_b -Reinstate a Monica
Quiero mejorar la predicción del modelo de regresión usando lm (Y ~ X + log (X)). Para esto, ¿cuál sería su recomendación para evitar log (0)?
rnso
55
No puede tener log (X) allí; ya lo has establecido. Entonces, ¿qué estás tratando de lograr realmente? Dado que no puede tomar log (0), ¿qué desea obtener de la regresión? ¿Por qué quieres iniciar sesión (X) allí? ¿Qué puedes tolerar en lugar de tener log (X) allí?
Glen_b: reinstala a Monica
3
¿Qué es la ciencia aquí? Debería ser una guía de qué hacer.
Nick Cox
1
rnso No veo nada allí que aborde los problemas que planteo (o, lo que es más importante, el que planteó Nick Cox), ni nada que pueda orientar una respuesta a la pregunta aquí.
Glen_b: reinstala a Monica

Respuestas:

8

Cuanto más pequeña es la constante es que agregas, más grande es el valor atípico que crearás: ingrese la descripción de la imagen aquí

Por lo tanto, es difícil justificar cualquier constante aquí. Puede considerar una transformación que no tenga problemas con 0s, por ejemplo, un polinomio de tercer orden.

Maarten Buis
fuente
¿Es x + x ^ 2 + x ^ 3 equivalente a log (x)? Consulte mis comentarios en otra respuesta para saber por qué estoy tratando de usar valores de registro.
rnso
2
No son equivalentes sino alternativas.
Maarten Buis
10

¿Por qué quieres trazar logaritmos? ¿Qué hay de malo en trazar las variables tal como son?

Una razón para trabajar con registros es, por ejemplo, cuando una distribución generadora supuesta es logarítmica normal.

Otra sería que los números representan parámetros de escala o se usan de forma multiplicativa, en cuyo caso el espacio en el que se encuentran es naturalmente logarítmico (por la misma razón que el anterior de Jeffreys de una variable de escala es logarítmico).

Ninguno de estos es el caso. Creo que la respuesta correcta aquí es no hacerlo. Primero invente un modelo de generación de datos, y luego use sus datos de manera consistente con eso.

Parece que lo que está tratando de hacer es agregar tantas funciones de las entradas como sea posible para que tenga un "gran ajuste". ¿Por qué no agrega ninguna de estas funciones: http://en.wikipedia.org/wiki/List_of_mathematical_functions ? Oh, probablemente pienses que muchos de esos son ridículos, como la función de Ackermann. ¿Por qué son ridículos? Cada función de la entrada que agrega es esencialmente su hipótesis de una relación. Es difícil para cualquiera de nosotros imaginar que es una función de la función totient de Euler aplicada a . Es por eso que estoy en contra de que sea ​​una función de . Me parece igualmente ridículo a menos que me expliques esta hipótesis.x y log xyxylogx

Probablemente lo único que obtendrá al agregar continuamente funciones de las entradas es un modelo sobreajustado. Si desea un modelo que realmente valide bien, debe hacer buenas suposiciones y tener suficientes datos para aprender un modelo. Cuantas más suposiciones haga, más parámetros tendrá, más datos necesitará.

Neil G
fuente
No quiero trazar registros. Quiero usar la variable X en regresión. Para obtener el mejor ajuste, supongo que deberíamos incluir log y también polinomios. Para eso necesito valores de registro.
rnso
@rnso: ¿Entonces te imaginas que el valor objetivo es un producto de estas entradas? Es muy extraño que el valor objetivo esté relacionado con las entradas de forma multiplicativa cuando la entrada puede ser cero.
Neil G
No producto sino suma. Estoy tratando de usar la fórmula: lm (Y ~ X + log (X))
rnso
1
@rnso: sí, pero agregar esos términos de registro es como decir que , y ¿por qué pensarías que si puede ser cero? x ieyxiwixi
Neil G
1
Omitir el término de registro. Ya tienes el coeficiente del término de registro: No es un número
Caleth
3

Es difícil decir con tan pocos detalles sobre sus datos y solo seis observaciones, pero tal vez su problema radique en su variable Y (limitada entre cero y uno) y no en su X. Observe el siguiente enfoque utilizando los dos parámetros función log-logistic del paquete 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))))

ingrese la descripción de la imagen aquí

Aghila
fuente
1

Mirando la gráfica de y vs x, la forma funcional parece ser y = 1 - exp (-alpha x), con un alfa muy alto. Esta es una función de paso cercana pero no del todo y necesitará una gran cantidad de polinomios para ajustar estos datos (piense en términos de exp (x) = 1 + x + x ^ 2/2! +. + X ^ n / n! + ...). Al reorganizar los términos, obtenemos exp (-alpha x) = 1-y. Si toma registros ahora, esto da -alpha x = log (1-y). Podría definir una nueva variable z = log (1-y) e intentar encontrar el alfa que mejor se ajuste a los datos. Todavía tiene el problema de cómo manejar y = 1. No conozco el contexto de su problema, pero mi impresión es que tendría que pensar en y asintóticamente acercándose a 1 cuando x se acerca a 1 y pero en realidad nunca llega a 1.

Pensando en esto un poco más, me pregunto si los datos son realmente de una distribución de Weibull y = 1 - exp (-alpha x ^ beta). Al reorganizar los términos, obtenemos beta log (x) = log (-log (1-y)) - log (alpha) y podemos usar OLS para obtener alfa y beta. El problema de manejar y = 1 permanece.

usuario280432
fuente
Gracias. Buen analisis.
rnso