如果我偏向正数,我通常会记录日志。但是,对于包含零的高度偏斜的非负数据,我该怎么办?我已经看到使用了两种转换:
- 具有巧妙的功能,即0映射到0。
- 其中c被估计或设置为一些非常小的正值。
还有其他方法吗?是否有充分的理由选择一种方法而不是其他方法?
如果我偏向正数,我通常会记录日志。但是,对于包含零的高度偏斜的非负数据,我该怎么办?我已经看到使用了两种转换:
还有其他方法吗?是否有充分的理由选择一种方法而不是其他方法?
Answers:
在我看来,最合适的转换选择取决于模型和上下文。
“ 0”点可能是由几种不同的原因引起的,每个原因都可能需要区别对待:
我没有真正提供答案,因为我怀疑当您有零时,没有通用的“正确”变换。
没有人提到反双曲正弦变换。为了完整起见,我在这里添加它。
这是Box-Cox变换的替代方法,由 其中。对于任何值,零都映射为零。就像两参数BC转换一样,还有两个参数版本允许移动。Burbidge,Magee和Robb(1988)讨论了IHS转换,包括估计。θ > 0 θ θ
IHS转换适用于在整个实线上定义的数据,包括负值和零。对于较大的值,其行为类似于对数变换,而不管的值(0除外)如何。极限情况为给出。θ θ → 0 ˚F (Ý ,θ )→ ÿ
在我看来,IHS转型应该比现在更广为人知。
将变量用作回归中的独立因子时,一种有用的方法是用两个变量替换它:一个是二进制变量,指示它是否为零,另一个是原始变量的值或它的重新表达,例如其对数。Hosmer&Lemeshow在关于逻辑回归的书中对此技术进行了讨论(我敢肯定在其他地方)。原始变量正值的截断概率图可用于识别适当的重新表达。(有关示例,请参见https://stats.stackexchange.com/a/30749/919上的分析。)
当变量是线性模型中的因变量时,经过审查的回归(如Tobit)会很有用,从而避免了产生初始对数的需要。这种技术在计量经济学家中很常见。
带移位的对数变换是Box-Cox变换的特殊情况:
这些是负值的扩展形式,但也适用于包含零的数据。Box and Cox(1964)提出了一种使用最大似然来找到的合适值的算法。这为您带来了最终的转变。
选择Box-Cox转换的原因是开发它们是为了确保对线性模型的假设。有一些工作表明,即使您的数据无法转换为正态性,估计的仍会导致对称分布。
我不确定这对您的数据的处理效果如何,因为可能只是您提到的对数转换,但是可能值得估计所需的以查看是否改造是适当的。λ
在R中,boxcox.fit
包中的函数geoR
将为您计算参数。
lambda2=TRUE
在的参数中指定boxcox.fit
。(还更新了答案。)
boxcoxfit
。
我假设零!=缺少数据,因为这是一个完全不同的问题。
在考虑如何在多元线性回归中处理零时,我倾向于考虑实际上有多少个零?
只有几个零
如果我在相当大的数据集中只有一个零,那么我倾向于:
模型适合吗?参数值呢?如果模型对于删除点相当鲁棒,那么我将寻求添加快速而肮脏的方法。
您可以简化此过程,并使用boxcox方法,并在ars的答案中进行介绍。
大量零
如果我的数据集包含大量零,那么这表明简单的线性回归并不是完成这项工作的最佳工具。相反,我会使用类似混合建模的方法(如Srikant和Robin所建议)。
如果您想要快速又脏的东西,为什么不使用平方根呢?
将@RobHyndman提供的答案与对数加一转换扩展为负值,格式为:
r = -1000:1000
l = sign(r)*log1p(abs(r))
l = l/max(l)
plot(r, l, type = "l", xlab = "Original", ylab = "Transformed", col = adjustcolor("red", alpha = 0.5), lwd = 3)
#We scale both to fit (-1,1)
for(i in exp(seq(-10, 100, 10))){
s = asinh(i*r)
s = s / max(s)
lines(r, s, col = adjustcolor("blue", alpha = 0.2), lwd = 3)
}
legend("topleft", c("asinh(x)", "sign(x) log(abs(x)+1)"), col = c("blue", "red"), lty = 1)
由于已经提出了两参数拟合Box-Cox,因此这里有一些R可以拟合输入数据,对其运行任意函数(例如时间序列预测),然后返回倒相输出:
# Two-parameter Box-Cox function
boxcox.f <- function(x, lambda1, lambda2) {
if (lambda1!=0) {
return(((x + lambda2) ^ lambda1 - 1) / lambda1)
} else {
return(log(x + lambda2))
}
}
# Two-parameter inverse Box-Cox function
boxcox.inv <- function(x, lambda1, lambda2) {
if (lambda1!=0) {
return((lambda1 * x + 1) ^ (1 / lambda1) - lambda2)
} else {
return(exp(x) - lambda2)
}
}
# Function to Box-Cox transform x, apply function g,
# and return inverted Box-Cox output y
boxcox.fit.apply <- function(x, g) {
require(geoR)
require(plyr)
# Fit lambdas
t <- try(lambda.pair <- boxcoxfit(x, lambda2=T)$lambda)
# Estimating both lambdas sometimes fails; if so, estimate lambda1 only
if (inherits(t, "try-error")) {
lambda1 <- boxcoxfit(x)$lambda
lambda2 <- 0
} else {
lambda1 <- lambda.pair[1]
lambda2 <- lambda.pair[2]
}
x.boxcox <- boxcox.f(x, lambda1, lambda2)
# Apply function g to x.boxcox. This should return data similar to x (e.g. ts)
y <- aaply(x.boxcox, 1, g)
return(boxcox.inv(y, lambda1, lambda2))
}
假设Y是每个美国人在给定年份在新车上花费的金额(总购买价)。Y将在0峰值;0到12,000之间的值将完全没有;并将采用其他价值观,主要是在十几岁,二十多岁和成千上万的人中。预测器将是进行此类购买的需求和/或兴趣水平的代理。对于没有购买商品的个人,几乎不能说需求或兴趣为零。在这些规模上,非购买者比Y甚至更接近Y的对数会更接近购买者。在类似这样的情况下,但在医疗保健领域,我发现通过测试集/训练集交叉验证判断出的最准确的预测是按递增顺序获得的,
有些人会反感连续因变量的这种分类。但是,尽管分类会牺牲一些信息,但是分类似乎可以通过恢复情况的一个重要基础方面来提供帮助-再次,“零”与其余部分比Y表示的要相似得多。
讨论的汝约翰逊变电这里有专门用来处理零和底片,而在箱Cox幂转换的优势打造卓越性能。这是我处理零或负数据时通常要去的事情。
这是对优点/缺点进行转换的摘要,以说明为什么使用Yeo-Johnson是更可取的。
日志记录
优点:良好的正面数据。
缺点:不处理零。
> log(0)
[1] -Inf
日志加1
优点:加1的偏移量增加了处理正数据之外的零的能力。
缺点:负数据失败
> log1p(-1)
[1] -Inf
> log1p(-2)
[1] NaN
Warning message:
In log1p(-2) : NaNs produced
平方根
优点:使用能处理零和正数据的幂变换。
缺点:负数据失败
> sqrt(-1)
[1] NaN
Warning message:
In sqrt(-1) : NaNs produced
Box Cox
R代码:
box_cox <- function(x, lambda) {
eps <- 0.00001
if (abs(lambda) < eps)
log(x)
else
(x ^ lambda - 1) / lambda
}
优点:实现按比例缩放的电源转换
缺点:遭受零和负数的问题(即只能处理正数数据)。
> box_cox(0, lambda = 0)
[1] -Inf
> box_cox(0, lambda = -0.5)
[1] -Inf
> box_cox(-1, lambda = 0.5)
[1] NaN
杨强森
R代码:
yeo_johnson <- function(x, lambda) {
eps <- .000001
not_neg <- which(x >= 0)
is_neg <- which(x < 0)
not_neg_trans <- function(x, lambda) {
if (abs(lambda) < eps) log(x + 1)
else ((x + 1) ^ lambda - 1) / lambda
}
neg_trans <- function(x, lambda) {
if (abs(lambda - 2) < eps) - log(-x + 1)
else - ((-x + 1) ^ (2 - lambda) - 1) / (2 - lambda)
}
x[not_neg] <- not_neg_trans(x[not_neg], lambda)
x[is_neg] <- neg_trans(x[is_neg], lambda)
return(x)
}
优点:可以处理正,零和负数据。
缺点:我想不到的。属性与Box-Cox非常相似,但可以处理零和负数据。
> yeo_johnson(0, lambda = 0)
[1] 0
> yeo_johnson(0, lambda = -0.5)
[1] 0
> yeo_johnson(-1, lambda = 0.5)
[1] -1.218951
为了阐明如何处理回归模型中的零对数,我们编写了一份教学论文,解释了最佳解决方案和人们在实践中常犯的错误。我们还提出了解决该问题的新解决方案。
您可以通过单击此处找到论文:https : //ssrn.com/abstract=3444996
在我们的文章中,我们实际上提供了一个示例,其中添加非常小的常数实际上可以提供最高的偏差。我们提供派生偏见的表达。
实际上,泊松伪极大似然(PPML)可以被视为解决此问题的好方法。必须考虑以下过程:
我们证明了该估计量是无偏的,并且可以使用GMM和任何标准统计软件简单地对其进行估计。例如,可以通过仅使用Stata执行一行代码来进行估计。
希望本文能对您有所帮助,我们希望能收到您的反馈。
ChristopheBellégo和Louis-Daniel Pape CREST-理工学院-ENSAE