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


10

我有以下简单的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
它们都不是,它们都是,因此任何关于“正确性”的概念都是胡说八道。它们都不是 “正确” 。要在它们之间进行选择,您必须更多地说明所需的属性以及准备放弃的属性。您实际上想实现什么?日志x + c 日志x log(x)log(x+c)log(x)
Glen_b-恢复莫妮卡

我想通过使用lm(Y〜X + log(X))改进回归模型的预测。为此,您对避免log(0)的建议是什么?
rnso 2015年

5
您不能那里找到 log(X);您已经确定了。那么,您实际上想实现什么?鉴于您无法取log(0),您想从回归中得到什么?您为什么要在其中登录(X)?您可以忍受什么而不是在那里拥有log(X)?
Glen_b-恢复莫妮卡

3
这里的科学是什么?它应该是做什么的指南。
尼克·考克斯

1
因此,我在这里看不到任何可以解决我提出的问题的东西(或更重要的是,尼克·考克斯提出的问题),也没有任何可以指导此处问题答案的东西。
Glen_b-恢复莫妮卡

Answers:


8

添加的常数越小,将创建的离群值越大: 在此处输入图片说明

因此,很难在这里证明任何常数。您可能会考虑使用0没问题的转换,例如三阶多项式。


x + x ^ 2 + x ^ 3等价于log(x)吗?请查看我在其他答案中的评论,以了解为什么我尝试使用日志值。
rnso 2015年

2
它们不是等效的,而是替代方案。
Maarten Buis,2015年

10

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

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

另一个可能是数字代表比例参数或被乘以使用,在这种情况下,它们所在的空间自然是对数的(出于与比例变量先于Jeffrey的对数相同的原因)。

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

听起来您要尝试的是添加尽可能多的输入功能,以使您“非常适合”。您为什么不添加以下任何功能:http : //en.wikipedia.org/wiki/List_of_mathematical_functions?哦,您可能会认为其中许多都是荒谬的,例如Ackermann函数。他们为什么荒谬?您添加的输入的每个函数本质上都是您的关系假设。我们中的每个人都很难想象是应用于的欧拉totient函数的函数。这就是为什么我反对是的函数的原因。除非您向我解释这个假设,否则对我来说似乎同样荒谬。x y 日志xyxylogx

不断增加输入功能可能唯一要得到的就是过拟合模型。如果您想要一个能够很好地验证的模型,则需要做出很好的猜测并拥有足够的数据来学习模型。您进行的猜测越多,拥有的参数越多,所需的数据就越多。


我不想绘制日志。我想在回归中使用变量X。为了获得最佳拟合,我认为我们应该包括对数以及多项式。为此,我需要日志值。
rnso

@rnso:所以您在想目标值是这些输入的乘积?当输入可以为零时,目标值与输入成倍地相关是很奇怪的。
Neil G

不是产品,而是总和。我正在尝试使用公式:lm(
Y〜X

1
@rnso:是的,但是添加这些对数术语就像说,为什么您认为可以为零? X eyxiwixi
Neil G

1
您忽略了对数词。您已经具有对数项的系数:Not a Number
Caleth,2015年

3

很难说关于数据的细节很少,只有六个观测值,但是也许您的问题出在Y变量(介于0和1之间)而不是X上。请看一下使用两参数的以下方法来自drc软件包的log-logistic函数:

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

在此处输入图片说明


1

从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。

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


谢谢。很好的分析。
rnso
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.