没有乘法误差的对数转换数据的回归模型

机器算法验证 r 回归 广义线性模型 错误 对数
2022-03-05 19:00:03

我有一组数据,其中一个解释变量和一个响应变量。它们都非常偏斜,因此已使用对数进行了转换以使它们“更正常”。

当我在两个变量之间创建线性回归时,拟合非常好(R 平方为 0.85),但由于使用对数变换的误差的乘法性质,较大的值在进行反向变换后会被严重低估。

以下示例说明了我的意思:

set.seed(10)

x=rlnorm(100,5,1)
y=rlnorm(100,2,2)

x=sort(x, decreasing = FALSE)
y=sort(y, decreasing = FALSE)

DF=data.frame(x=x,y=y)

## Plot relationship between variables
plot(log(y)~log(x))

记录变量之间的关系。

## Create regression using logged data
fit=lm(log(y)~log(x), data=DF)
summary(fit)

## Plot regression line
plot(log(y)~log(x))
abline(-7.936712,1.990450, col="red")

包括回归的关系

## Compute predicted y values by back-transforming
DF$Predicted=(exp(-7.936712)*(DF$x^1.990450))

## Calculate sum of actual vs. predicted.
sum(DF$y)
# 4632.657
sum(DF$Predicted)
# 3792.603

## Create model between actual and predicted.
pred_fit=lm(Predicted~y-1, data=DF)
summary(pred_fit)
plot(Predicted~y-1,data=DF)
abline(0,1, col="red")

实际与拟合之间的回归

有人建议我尝试其他模型(例如 GLM),但似乎无法准确确定这些模型如何适用。我这样做的原因是:

  • 一旦应用了响应变量和解释变量的对数变换,变量之间的关系似乎是线性的。因此,GLM 将受制于高斯族(如果我错了,请纠正我),因此与我已经拥有的没有区别。

如果我使用对数链接函数将 GLM 应用于未转换的数据,那么这会将对数转换应用于我的响应或解释变量(或两者),并且我需要在之后进行反向转换,就像我一样与线性模型?

此外,我看不出这是否能解决乘法误差问题,这是我探索这个问题的动机。最后,我想使用对数刻度在绘图上查看这个 GLM 的结果,这样我就可以看到模型对数据的拟合程度。不确定这是否可能,但它可能会帮助我理解。

1个回答

我在这里说明了五个适合模型的选项。他们所有人的假设是,这种关系实际上是y=axb我们只需要决定合适的错误结构。

1.) 首先是 OLS 模型lny=a+blnx+ε,即反向变换后的乘法误差。

fit1 <- lm(log(y) ~ log(x), data = DF)

我认为这实际上是一个适当的错误模型,因为您显然会随着值的增加而增加分散。

2.) 非线性模型y=αxb+ε,即附加误差。

fit2 <- nls(y ~ a * x^b, data = DF, start = list(a = exp(coef(fit1)[1]), b = coef(fit1)[2]))

3.) 具有高斯分布和对数链接函数的广义线性模型。当我们绘制结果时,我们将看到这实际上是与 2 相同的模型。

fit3 <- glm(y ~ log(x), data = DF, family = gaussian(link = "log"))

4.) 非线性模型为 2,但具有方差函数s2(y)=exp(2ty),它增加了一个额外的参数。

library(nlme)
fit4 <- gnls(y ~ a * x^b, params = list(a ~ 1, b ~ 1),
             data = DF, start = list(a = exp(coef(fit1)[1]), b = coef(fit1)[2]), 
             weights = varExp(form = ~ y))

5.) 具有伽马分布和日志链接的 GLM。

fit5 <- glm(y ~ log(x), data = DF, family = Gamma(link = "log"))

现在让我们绘制它们:

plot(y ~ x, data = DF)
curve(exp(predict(fit1, newdata = data.frame(x = x))), col = "green", add = TRUE)
curve(predict(fit2, newdata = data.frame(x = x)), col = "black", add = TRUE)
curve(predict(fit3, newdata = data.frame(x = x), type = "response"), col = "red", add = TRUE, lty = 2)
curve(predict(fit4, newdata = data.frame(x = x)), col = "brown", add = TRUE)
curve(predict(fit5, newdata = data.frame(x = x), type = "response"), col = "cyan", add = TRUE)

legend("topleft", legend = c("OLS", "nls", "Gauss GLM", "weighted nls", "Gamma GLM"),
       col = c("green", "black", "red", "brown", "cyan"),
       lty = c(1, 1, 2, 1, 1))

结果图

我希望这些拟合能说服您,您实际上应该使用允许较大值的较大方差的模型。甚至我拟合方差模型的模型也同意这一点。如果您使用非线性模型或高斯 GLM,您会过度重视较大的值。

最后,您应该仔细考虑假设的关系是否正确。有科学理论支持吗?