如何避免回归中的 log(0) 项

机器算法验证 r 回归 对数正态分布
2022-03-26 07:06:51

我有以下简单的 X 和 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)

在此处输入图像描述

我想使用 X 的日志进行回归。为了避免得到 log(0),我尝试输入 +1 或 +0.1 或 +0.00001 或 +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

在所有情况下,输出都是不同的。在回归中避免 log(0) 的正确值是多少?这种情况的正确方法是什么。

编辑:我的主要目的是通过添加对数项来改进回归模型的预测,即:lm(Y ~ X + log(X))

4个回答

为什么要绘制对数?按原样绘制变量有什么问题?

例如,使用日志的一个原因是假设生成分布是对数正态分布。

另一个是数字代表尺度参数或乘法使用,在这种情况下,它们所在的空间自然是对数的(与尺度变量的杰弗里斯先验是对数的原因相同)。

这些都不是。我认为这里的正确答案是不要这样做。首先提出一个数据生成模型,然后以与之一致的方式使用您的数据。

听起来您正在尝试做的是添加尽可能多的输入功能,以便您获得“非常合适”。为什么不添加以下任何功能: http ://en.wikipedia.org/wiki/List_of_mathematical_functions ?哦,你可能认为其中很多很荒谬,比如阿克曼函数。他们为什么可笑?您添加的输入的每个函数本质上都是您对关系的假设。我们都很难想象是应用于的 Euler 的 totient 函数的函数。这就是为什么我反对作为的函数。除非你向我解释这个假设,否则这对我来说似乎同样荒谬。yxylogx

通过不断添加输入函数,您可能会得到的唯一结果就是过拟合模型。如果您想要一个实际验证良好的模型,您需要做出正确的猜测并有足够的数据来学习模型。您做出的猜测越多,您将拥有的参数越多,您需要的数据就越多。

您添加的常数越小,您将创建的异常值越大: 在此处输入图像描述

所以在这里很难证明任何常数是正确的。您可能会考虑一个对 0 没有问题的转换,例如三阶多项式。

很难说关于您的数据的细节如此之少并且只有六个观察结果,但也许您的问题在于您的 Y 变量(在零和一之间)而不是在您的 X 中。看看以下使用两个参数的方法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))))

在此处输入图像描述

查看 y 与 x 的图,函数形式似乎是 y = 1 - exp(-alpha x),具有非常高的 alpha。这接近但不完全是阶跃函数,您将需要大量多项式来拟合此数据(考虑 exp(x) = 1 + x +x^2/2! + . + x^n/ n! + ...)。重新排列术语,我们得到 exp(-alpha x) = 1-y。如果您现在记录日志,这将给出 -alpha x = log(1-y)。您可以定义一个新变量 z = log(1-y) 并尝试找到最适合数据的 alpha。您仍然有如何处理 y = 1 的问题。我不知道您的问题的背景,但我的印象是,当 x 接近 1 时,您将不得不考虑 y 渐近接近 1,但 y 从未真正达到 1。

再想一想,我想知道数据是否实际上来自 Weibull 分布 y = 1 - exp(-alpha x^beta)。重新排列术语,我们得到 beta log(x) = log(-log(1-y)) - log(alpha),我们可以使用 OLS 来获得 alpha 和 beta。处理 y = 1 的问题仍然存在。