我有一组数据,其中一个解释变量和一个响应变量。它们都非常偏斜,因此已使用对数进行了转换以使它们“更正常”。
当我在两个变量之间创建线性回归时,拟合非常好(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 的结果,这样我就可以看到模型对数据的拟合程度。不确定这是否可能,但它可能会帮助我理解。