So vermeiden Sie den log (0) -Term in der Regression


10

Ich habe folgende einfache X- und Y-Vektoren:

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

Geben Sie hier die Bildbeschreibung ein

Ich möchte eine Regression mit dem Protokoll von X durchführen. Um zu vermeiden, dass das Protokoll (0) angezeigt wird, versuche ich, +1 oder +0.1 oder +0.00001 oder +0.000000000000001 zu setzen:

> 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

Die Ausgabe ist in allen Fällen unterschiedlich. Was ist der richtige Wert, um log (0) in der Regression zu vermeiden? Was ist die richtige Methode für solche Situationen.

Bearbeiten: Mein Hauptziel ist es, die Vorhersage des Regressionsmodells durch Hinzufügen eines logarithmischen Terms zu verbessern, dh: lm (Y ~ X + log (X))


4
Keiner von ihnen ist , sie sind alle , also ist jede Vorstellung von 'Korrektheit' Unsinn. Keiner von ihnen ist für 'korrekt' . Um zwischen ihnen zu wählen, müssten Sie mehr darüber sagen, welche Eigenschaften Sie möchten und welche Eigenschaften Sie aufgeben möchten. Was versuchst du eigentlich zu erreichen? log ( x + c ) log ( x )log(x)log(x+c)log(x)
Glen_b -Reinstate Monica

Ich möchte die Vorhersage des Regressionsmodells durch Verwendung von lm (Y ~ X + log (X)) verbessern. Was würden Sie dazu empfehlen, log (0) zu vermeiden?
rnso

5
Sie können nicht haben log (X) gibt; das hast du schon festgestellt. Was versuchst du eigentlich zu erreichen? Angenommen , Sie können nicht nehmen log (0), was wollen Sie von der Regression raus? Warum möchten Sie sich dort anmelden (X)? Was können Sie tolerieren, anstatt dort log (X) zu haben?
Glen_b -Rate State Monica

3
Was ist die Wissenschaft hier? Es sollte eine Anleitung sein, was zu tun ist.
Nick Cox

1
Außerdem sehe ich dort nichts, was sich mit den von mir angesprochenen Themen befasst (oder, was noch wichtiger ist, das von Nick Cox angesprochene), und auch nichts, was eine Antwort auf die Frage hier liefern könnte.
Glen_b -State Monica

Antworten:


8

Je kleiner die Konstante ist, die Sie hinzufügen, desto größer ist der Ausreißer, den Sie erstellen: Geben Sie hier die Bildbeschreibung ein

Daher ist es schwierig, hier eine Konstante zu rechtfertigen. Sie könnten eine Transformation in Betracht ziehen, die kein Problem mit Nullen hat, beispielsweise ein Polynom dritter Ordnung.


Entspricht x + x ^ 2 + x ^ 3 log (x)? Bitte lesen Sie meine Kommentare in einer anderen Antwort, warum ich versuche, Protokollwerte zu verwenden.
rnso

2
Sie sind nicht gleichwertig, sondern Alternativen.
Maarten Buis

9

Warum möchten Sie Logarithmen zeichnen? Was ist falsch daran, die Variablen so zu zeichnen, wie sie sind?

Ein Grund für die Arbeit mit Protokollen besteht beispielsweise darin, dass eine angenommene generierende Verteilung logarithmisch normal ist.

Ein anderer wäre, dass die Zahlen Skalenparameter darstellen oder multiplikativ verwendet werden. In diesem Fall ist der Raum, in dem sie liegen, natürlich logarithmisch (aus demselben Grund, aus dem Jeffreys vor einer Skalenvariablen logarithmisch ist).

Beides ist nicht der Fall. Ich denke, die richtige Antwort hier ist, es nicht zu tun. Überlegen Sie sich zunächst ein datengenerierendes Modell und verwenden Sie Ihre Daten dann in einer Weise, die mit dieser übereinstimmt.

Es hört sich so an, als würden Sie versuchen, so viele Funktionen der Eingänge wie möglich hinzuzufügen, damit Sie eine "gute Passform" erhalten. Warum fügen Sie keine der folgenden Funktionen hinzu: http://en.wikipedia.org/wiki/List_of_mathematical_functions ? Oh, Sie denken wahrscheinlich, dass viele davon lächerlich sind, wie die Ackermann-Funktion. Warum sind sie lächerlich? Jede Funktion der Eingabe, die Sie hinzufügen, ist im Wesentlichen Ihre Hypothese einer Beziehung. Es fällt uns beiden schwer, uns vorzustellen, dass eine Funktion von Eulers Totientenfunktion ist, die auf angewendet wird . Deshalb bin ich dagegen, dass eine Funktion von . Es erscheint mir ebenso lächerlich, wenn Sie mir diese Hypothese nicht erklären.x y log xyxylogx

Wahrscheinlich ist das einzige, was Sie durch kontinuierliches Hinzufügen von Funktionen der Eingänge erhalten, ein überpassendes Modell. Wenn Sie ein Modell wünschen, das tatsächlich gut validiert werden kann, müssen Sie gute Vermutungen anstellen und über genügend Daten verfügen, um ein Modell zu lernen. Je mehr Vermutungen Sie anstellen, je mehr Parameter Sie haben, desto mehr Daten benötigen Sie.


Ich möchte keine Protokolle zeichnen. Ich möchte die Variable X in der Regression verwenden. Um die beste Passform zu erhalten, sollten wir logarithmische und auch Polynome einschließen. Dafür brauche ich Protokollwerte.
rnso

@rnso: Sie stellen sich also vor, dass der Zielwert ein Produkt dieser Eingaben ist? Es ist sehr seltsam, dass der Zielwert multiplikativ mit den Eingaben verknüpft ist, wenn die Eingabe Null sein kann.
Neil G

Nicht Produkt, sondern Summe. Ich versuche die Formel zu verwenden: lm (Y ~ X + log (X))
rnso

1
@rnso: Ja, aber das Hinzufügen dieser Protokollbegriffe ist wie zu sagen, dass , und warum würden Sie das denken, wenn Null sein kann? x ieyxiwixi
Neil G

1
Sie lassen den Protokollbegriff weg. Sie haben bereits den Koeffizienten des logarithmischen Ausdrucks: Keine Zahl
Caleth

3

Es ist schwer mit so wenigen Details zu Ihren Daten und nur sechs Beobachtungen zu sagen, aber vielleicht liegt Ihr Problem in Ihrer Y-Variablen (zwischen Null und Eins begrenzt) und nicht in Ihrem X. Sehen Sie sich den folgenden Ansatz mit den zwei Parametern an log-logistische Funktion aus dem DRC- Paket:

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

Geben Sie hier die Bildbeschreibung ein

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.