您正在从错误的方向进行此建模练习。你正在转型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
这里效果更好,因为这就是数据的生成方式。