如何在双对数R图中绘制线性回归?

4

我有以下数据:

someFactor = 500
x = c(1:250)
y = x^-.25 * someFactor

在双对数图中,我展示了以下内容:

plot(x, y, log="xy")

现在我使用线性模型“找出”数据的斜率:
model = lm(log(y) ~ log(x))
model

这将会得到:

Call:
lm(formula = log(y) ~ log(x))

Coefficients:
(Intercept)       log(x)  
      6.215       -0.250  

现在我想将线性回归绘制成红色线条,但abline无法正常工作:

abline(model, col="red")

如何在我的图表中添加回归线是最简单的方法?

3个回答

5
lines(log(x), exp(predict(model, newdata=list(x=log(x)))) ,col="red")

在使用对数作为自变量时,以对数刻度绘制的x值范围实际上与x本身的值范围有很大区别。以下是完整的范围:

lines(x, exp(predict(model, newdata=list(x=x))) ,col="red")

enter image description here


我只预测了两个值(一个接近零,另一个非常大)。然后这条线不仅在图表中最小值和最大值之间,而且超出了它们。 - R_User

4

您的线条正在绘制,只是因为值相差很大,所以在窗口中看不到。当包括log='xy'参数时,发生的情况是图表下方(可以这么说)的空间被扭曲(拉伸和/或压缩),尽管仍然使用原始数字。(想象一下你手动在图纸上绘制这些点;你仍然标记了一个点,例如(1,500),交叉处的淡蓝色图形线,但是图纸已连续被拉伸,因此线不再等距离分布。)另一方面,您的模型使用转换后的数据。

您需要使用与您的模型相同的转换数据进行绘图,然后以足够直观易懂的方式重新标记坐标轴。这是第一次尝试:

plot(log(x), log(y), axes=FALSE, xlab="X", ylab="Y")
box()
axis(side=1,     at=log(c(1,2, 10,20, 100,200)), 
             labels=c(    1,2, 10,20, 100,200))
axis(side=2,     at=log(c(125,135, 250,260, 350, 500)), 
             labels=c(    125,135, 250,260, 350, 500))
abline(model, col="red")

enter image description here


1
有时候我讨厌 R,似乎没有办法在不操纵原始数据的情况下添加回归线。此外,我还必须操纵数据以获得误差条(errbar)和漂亮的轴刻度(eaxis),因为这也没有默认实现。 - R_User
我认为这是 R 中的一个错误。 - Chris

3

不要转换坐标轴,将 xy 进行对数变换后绘制图形。

plot(log(x), log(y))
abline(model, col="red")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接