Comment éviter le terme log (0) en régression

10

J'ai les vecteurs X et Y simples suivants:

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

entrez la description de l'image ici

Je veux faire une régression en utilisant le journal de X. Pour éviter d'obtenir le journal (0), j'essaie de mettre +1 ou +0,1 ou +0,00001 ou +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 sortie est différente dans tous les cas. Quelle est la valeur correcte à mettre pour éviter le log (0) en régression? Quelle est la bonne méthode pour de telles situations.

Edit: mon objectif principal est d'améliorer la prédiction du modèle de régression en ajoutant un terme logarithmique, c'est-à-dire: lm (Y ~ X + log (X))

rnso
la source
4
Aucun d'eux n'est , ils sont tous , donc toute notion de «correction» est absurde. Aucun d'entre eux n'est «correct» pour . Pour choisir entre eux, vous devez en dire plus sur les propriétés que vous souhaitez et celles que vous êtes prêt à abandonner. Qu'essayez-vous réellement de réaliser? log ( x + c ) log ( x )log(x)log(x+c)Journal(X)
Glen_b -Reinstate Monica
Je veux améliorer la prédiction du modèle de régression en utilisant lm (Y ~ X + log (X)). Pour cela, quelle serait votre recommandation pour éviter le log (0)?
rnso
5
Vous ne pouvez pas y avoir de journal (X); vous l'avez déjà établi. Alors, qu'essayez-vous réellement d'atteindre? Étant donné que vous ne pouvez pas prendre le journal (0), que voulez-vous retirer de la régression? Pourquoi voulez-vous vous connecter (X) là-dedans? Que pouvez-vous tolérer au lieu d'avoir log (X) là-dedans?
Glen_b -Reinstate Monica
3
Quelle est la science ici? Cela devrait être un guide pour savoir quoi faire.
Nick Cox
1
Je ne vois donc rien là-dedans qui aborde les questions que je soulève (ou plus important encore, celui que Nick Cox a soulevé), ni même quoi qui pourrait guider une réponse à la question ici.
Glen_b -Reinstate Monica

Réponses:

8

Plus la constante est petite, plus la valeur aberrante est grande, plus vous créerez: entrez la description de l'image ici

Il est donc difficile de justifier une constante ici. Vous pourriez envisager une transformation qui n'a aucun problème avec les 0, par exemple un polynôme du troisième ordre.

Maarten Buis
la source
X + x ^ 2 + x ^ 3 est-il équivalent à log (x)? Veuillez consulter mes commentaires dans d'autres réponses pour savoir pourquoi j'essaie d'utiliser les valeurs de journal.
rnso
2
Ils ne sont pas équivalents mais alternatifs.
Maarten Buis
10

Pourquoi voulez-vous tracer des logarithmes? Quel est le problème avec le traçage des variables telles qu'elles sont?

Une raison de travailler avec des journaux est quand une distribution de génération supposée est normale au journal, par exemple.

Un autre serait que les nombres représentent des paramètres d'échelle ou sont utilisés de manière multiplicative, auquel cas l'espace dans lequel ils se trouvent est naturellement logarithmique (pour la même raison que le Jeffreys avant d'une variable d'échelle est logarithmique).

Ni l'un ni l'autre n'est le cas. Je pense que la bonne réponse ici est de ne pas le faire. Concevez d'abord un modèle de génération de données, puis utilisez vos données de manière cohérente avec cela.

yXyJournalX

La seule chose que vous obtiendrez probablement en ajoutant continuellement des fonctions des entrées est un modèle surajusté. Si vous voulez un modèle qui se valide bien, vous devez faire de bonnes suppositions et avoir suffisamment de données pour apprendre un modèle. Plus vous devinez, plus vous aurez de paramètres, plus vous aurez besoin de données.

Neil G
la source
Je ne veux pas tracer de journaux. Je veux utiliser la variable X dans la régression. Pour obtenir le meilleur ajustement, je suppose que nous devrions inclure le journal et les polynômes. Pour cela, j'ai besoin de valeurs de journal.
rnso
@rnso: Vous imaginez donc que la valeur cible est un produit de ces entrées? Il est très étrange que la valeur cible soit liée aux entrées de manière multiplicative lorsque l'entrée peut être nulle.
Neil G
Pas un produit mais une somme. J'essaie d'utiliser la formule: lm (Y ~ X + log (X))
rnso
1
eyXjewjeXje
1
vous omettez le terme du journal. Vous avez déjà le coefficient du terme logarithmique: Pas un nombre
Caleth
3

Il est difficile de dire avec si peu de détails sur vos données et seulement six observations, mais votre problème réside peut-être dans votre variable Y (limitée entre zéro et un) et non dans votre X. Jetez un œil à l'approche suivante en utilisant les deux paramètres fonction log-logistique du paquet 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))))

entrez la description de l'image ici

Aghila
la source
1

En regardant l'intrigue de y vs x, la forme fonctionnelle semble être y = 1 - exp (-alpha x), avec un alpha très élevé. C'est une fonction pas à pas mais pas tout à fait et vous aurez besoin d'un grand nombre de polynômes pour ajuster ces données (pensez en termes de exp (x) = 1 + x + x ^ 2/2! +. + X ^ n / n! + ...). En réarrangeant les termes, nous obtenons exp (-alpha x) = 1-y. Si vous prenez des journaux maintenant, cela donne -alpha x = log (1-y). Vous pouvez définir une nouvelle variable z = log (1-y) et essayer de trouver l'alpha qui correspond le mieux aux données. Vous avez toujours la question de savoir comment gérer y = 1. Je ne connais pas le contexte de votre problème, mais mon impression est que vous devriez penser à y approcher asymptotiquement 1 comme x approche 1 et mais y n'atteint jamais réellement 1.

En y réfléchissant un peu plus, je me demande si les données proviennent réellement d'une distribution de Weibull y = 1 - exp (-alpha x ^ beta). En réorganisant les termes, nous obtenons bêta log (x) = log (-log (1-y)) - log (alpha) et nous pouvons utiliser OLS pour obtenir alpha et bêta. Le problème de la gestion de y = 1 demeure.

user280432
la source
Merci. Bonne analyse.
rnso