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)
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))
r
regression
lognormal
rnso
la source
la source
Réponses:
Plus la constante est petite, plus la valeur aberrante est grande, plus vous créerez:
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.
la source
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.
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.
la source
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 :
la source
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.
la source