如果我在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转换回正常比例并将曲线绘制在我之前的线性曲线上?
答案 0 :(得分:11)
嗯,我不太清楚你的意思是“将曲线与早先的线性曲线对比”。
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)
......虽然我不确定为什么......
答案 1 :(得分:9)
我不确定你的意思......但我猜到了一点不同。我想你想让两个模型适合这些点,一个是线性的,一个是记录的。然后,您想绘制两个模型的点和功能形式。这是代码:
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轴,则显示的直线将是直线。