【问题标题】:Fitting logarithmic curve in R在 R 中拟合对数曲线
【发布时间】:2016-08-04 01:03:24
【问题描述】:

如果我在 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 转换回正常缩放比例并根据我之前的线性曲线绘制曲线?

【问题讨论】:

    标签: r curve-fitting linear-regression logarithm


    【解决方案1】:

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

    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)
    

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

    【讨论】:

    • 非常感谢。您的第二种方式,使用曲线功能,正是我想要的。构建数据的具体作用和预测的作用是什么?我没有从 help() 函数告诉我的内容中得到什么。
    • 将数据放入数据框中使未来使用拟合对象(预测等)的工作更加直接,因为它使 R 更容易定位输入变量。 predict() 预测 ...
    【解决方案2】:

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

    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 轴,则显示的线将是直的。

    【讨论】:

    • 请注意,如果您想要一个平滑的对数曲线,您需要使用预测的newdata 形式...如果您的数据碰巧没有增加@,结果会很奇怪987654329@ order ...(但基本思路是合理的)
    • 同意。我以为我会追求简单而不是正确,但你是完全正确的。
    • 谢谢。这也给了我想要的东西(虽然不像曲线函数那样平滑)。我有点困惑,因为我认为 lm 总是返回一行。你的代码是什么使曲线而不是直线出现?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    • 2014-08-30
    相关资源
    最近更新 更多