如何取消转换指数图数据以恢复原始数据规模?

机器算法验证 r 数据转换 指数分布
2022-04-08 10:51:29

模拟数据/RepEx

err <- 0.5*rnorm(101)
x <- seq(from=500, to=1000, by = 5)
y <- exp(.005*x) + err
mydata <- data.frame(x,y)

我的原始数据包含大量数字,但 exp(large number) 超出了计算机的容量。然而,这种关系在生物学上应该是对数的。

所以,我只是将我的值除以 1000,一切都很好:

library(ggplot2)
library(broom)

myfit <- lm(y ~ exp(x/1000), data = mydata)
ggplot(mydata, aes(x,y))+geom_point()

我可以得到我的拟合值:

myfitted <- augment(myfit, data = mydata )

但是,我想可视化我的拟合值与我的实际数据的匹配程度。但是,我的拟合值不再与我的原始数据处于同一比例。我试图想出如何将它们调整回原始比例。理想情况下,这条线应该非常接近恒等式 (x=x)。

我尝试了以下方法:

ggplot(myfitted, aes(x=x, y=1000*log(.fitted))) + 
geom_point(color = "blue") + geom_point(aes(y=x), color="red") +
coord_fixed()

ggplot(myfitted, aes(x=x, y=log(.fitted*1000))) + 
geom_point(color = "blue") + geom_point(aes(y=x), color="red") + 
coord_fixed()

以及该主题的其他一些变体。自从我使用代数以来已经有一段时间了 - 我可以做些什么来扭转我的转换并以原始规模查看我的数据?

1个回答

您正在从错误的方向进行此建模练习。你正在转型x,这导致了大价值观的麻烦。相反,您可以转换y.

无论如何,您的尝试失败的原因是因为您试图将反向转换应用于拟合值,但您x在拟合模型之前转换了变量。

在这种情况下,您不需要对拟合值做任何事情。如果我们与你y作对exp(x/1000),你也会发现转换没有做任何感兴趣的事情

err <- 0.5*rnorm(101)
x <- seq(from=500, to=1000, by = 5)
y <- exp(.005*x) + err
mydata <- data.frame(x,y, expx = exp(x / 1000))
theme_set(theme_bw())

ggplot(mydata, aes(x = expx, y = y)) + geom_point()

在此处输入图像描述

所以你实现的所有转变都是重新x调整——关系根本没有线性化。如果你继续,你只会将一条直线拟合到非线性关系。x让我们这样做,因为它表明如果您像以前那样拟合模型,则根本不需要摆弄:

myfit1 <- lm(y ~ exp(x/1000), data = mydata)

newd <- data.frame(x = seq(500, 1000, by = 1))
newd <- transform(newd, Fitted = predict(myfit1, newd),
                        expx   = exp(x / 1000))

ggplot() +
  geom_point(aes(x = x, y = y), mydata) +
  geom_line(aes(x = x, y = Fitted), newd, size = 1)

在此处输入图像描述

如果我们在 exp(x/1000) 刻度上绘制,除了 x 轴上的标签之外,绘图是相同的

ggplot() +
  geom_point(aes(x = expx, y = y), mydata) +
  geom_line(aes(x = expx, y = Fitted), newd, size = 1)

在此处输入图像描述

您可以做的是转换y以使关系线性化

myfit2 <- lm(log(y) ~ x, data = mydata)

newd <- transform(newd, Fitted2 = exp(predict(myfit2, newd)))

ggplot() +
  geom_point(aes(x = x, y = y), mydata) +
  geom_line(aes(x = x, y = Fitted), newd, size = 1) +
  geom_line(aes(x = x, y = Fitted2), newd, size = 1, colour = "red")

现在哪个在拟合数据方面做得更好。

在此处输入图像描述

这里的基本点是,如果你转换x你不需要转换y

最后,遵循 Mosteller 和 Tukey 的凸出规则,对于数据中看到的关系,您可以y通过 sqrt 或 log 转换进行转换,或者x通过平方或立方进行转换。因此,根据该经验法则,您没有选择有用的转换。在这种情况下,我们可以通过应用以下变换来大致线性化关系

x=(x/1000)5

(除以 1000 只是为了避免 非常大的值x)。下图显示了y对如此变换x的图以及回归拟合

myfit3 <- lm(y ~ I((x/1000)^5), data = mydata)
newd <- transform(newd, Fitted3 = predict(myfit3, newd))

ggplot() +
  geom_point(aes(x = x, y = y), mydata) +
  geom_line(aes(x = x, y = Fitted3), newd, size = 1, col = "red")

在此处输入图像描述

但是,您选择的转换应该由您正在研究的系统决定。的对数转换在y这里效果更好,因为这就是数据的生成方式。