7

如果我在 R 中有一组线性点,我可以执行以下操作来绘制这些点,为它们拟合一条线,然后显示该线:

x=c(61,610,1037,2074,3050,4087,5002,6100,7015)
y=c(0.401244, 0.844381, 1.18922, 1.93864, 2.76673, 3.52449, 4.21855, 5.04368, 5.80071)

plot(x,y)    
Estimate = lm(y ~ x)    
abline(Estimate)

现在,如果我有一组看起来像对数曲线拟合的点更合适,如下所示:

x=c(61,610,1037,2074,3050,4087,5002,6100,7015)        
y=c(0.974206,1.16716,1.19879,1.28192,1.30739,1.32019,1.35494,1.36941,1.37505)

我知道我可以使用以下方法对 x 值的对数进行标准回归拟合:

logEstimate = lm(y ~ log(x))

但是,然后我如何将 logEstimate 转换回正常缩放并根据我之前的线性曲线绘制曲线?

4

2 回答 2

13

嗯,我不太清楚您所说的“根据我之前的线性曲线绘制曲线”是什么意思。

d <- data.frame(x,y)  ## need to use data in a data.frame for predict()
logEstimate <- lm(y~log(x),data=d)

以下是获取预测值的三种方法:

(1) 用途predict

plot(x,y)
xvec <- seq(0,7000,length=101)
logpred <- predict(logEstimate,newdata=data.frame(x=xvec))
lines(xvec,logpred)

(2) 提取数值系数值:

coef(logEstimate)
## (Intercept)      log(x) 
##  0.6183839   0.0856404 
curve(0.61838+0.08564*log(x),add=TRUE,col=2)

(3) 使用with()魔法(您需要在参数估计名称周围加上反引号,因为它们包含括号)

with(as.list(coef(logEstimate)),
      curve(`(Intercept)`+`log(x)`*log(x),add=TRUE,col=4))

也许你想要的是

est1 <- predict(lm(y~x,data=d),newdata=data.frame(x=xvec))
plot(est1,logpred)

...虽然我不知道为什么...

于 2012-07-19T21:12:21.310 回答
10

我也不完全确定你的意思......但我猜有点不同。我认为您想为这些点拟合两个模型,一个是线性的,一个是记录的。然后,您要绘制点以及两个模型的函数形式。这是代码:

x=c(61,610,1037,2074,3050,4087,5002,6100,7015)
y=c(0.974206,1.16716,1.19879,1.28192,1.30739,1.32019,1.35494,1.36941,1.37505)

Estimate = lm(y ~ x)
logEstimate = lm(y ~ log(x))

plot(x,predict(Estimate),type='l',col='blue')
lines(x,predict(logEstimate),col='red')
points(x,y)

在此处输入图像描述


针对评论中的第二个问题,线性回归确实总是返回预测变量的线性组合,但这并不一定意味着它是一条直线。想想你的log转变真正意味着什么:如果你适合,

y = log(x)

这与拟合相同

exp(y) = x

这意味着x随着线性增加,然后y将呈指数变化,这显然不是一条“直线”。但是,如果您在对数刻度上转换 x 轴,则显示的线将是直的。

于 2012-07-19T21:22:56.843 回答