r - 绘制 lm 返回的模型的结果

标签 r plot curve-fitting lm

抱歉,如果这是微不足道的,还没有找到解决方案。

为了简单起见,我有 5 个点(例如,d0 = c(1,2,3,4,5))和 5 个值(例如 f0 = c(0.8950514) 、1.240066、1.410252、1.494778、1.514794))。

我想概括这一点并找到一个函数f,使得f(d0) = f0。很简单。为此,如果我做对了,我需要进行一些试验和错误来找到 f 的正确结构;然后我可以使用 lm 提取其参数。对吗?

所以,我开始尝试一个简单的线性模型:

model <- lm(f0 ~ d0)$coefficients

然后我想绘制它以查看实际的拟合情况:

lines(d0, model[[1]] + d0*model[[2]])

问题

尝试其他类型的依赖项时,事情会变得无聊。例如,我可以猜测两者之间的日志日志依赖关系:

model <- lm(log(f0) ~ log(d0))$coefficients

但是为了绘制真实的函数,我需要将对行的调用更改为

lines(d0, exp(model2[[1]] + model2[[2]]*log(d0)))

现在,如果我要尝试另一种公式,我将不得不使用不同的代码行来表示 lines

问题

  1. 有没有办法自动绘制lm的结果(以lines(d0, Predicted.f)的形式),也许使用中的信息>lm$call

我的愿望是这样的:

model <- lm(f0 ~ d0)
plotFromModel(d0, model)
model <- lm(log(f0) ~ log(d0))
plotFromModel(d0, model)
  • 我在这里缺少什么吗?这个简单的任务应该使用 lm 和不同的公式来完成,还是有更明显的路径?
  • 编辑

    看起来没有更明显的路径了。我在这里澄清一下,这个问题是为了找到这 5 个点的最佳拟合一维曲线而产生的。因此,虽然我们被迫使用 lm,但我们必须对各种公式持开放态度,例如

    f0 ~ d0
    
    log(f0) ~ d0
    
    f0 ~ d0 + I(log(d0)^2)
    

    等等。最重要的是,我仍在寻找一个一维函数,即 y = f(x),其中 x 和 y 都是标量,并且不涉及其他参数。

    曲线拟合问题中的其他典型要求是,一旦您从 5 个点找到模型,您就可以看到其真实曲线(-> 使用任意长度的 d),并且可以将其与其他曲线进行比较您正在测试的模型。我想复制以下行为:

    d0 <- c(1,2,3,4,5)
    f0 <- c(0.8950514, 1.240066, 1.410252, 1.494778, 1.514794)
    d <- seq(from = 1, to = 5, length.out = 200)
    
    windows(w=700,h=500)
    plot(d0, f0, type='b',col='black', log='xy',lwd=4)
    grid()
    
    m <- lm(f0 ~ d0)$coefficients
    lines(d, m[1] + m[2]*d, col='orange', lwd=3)
    
    m <- lm(log(f0) ~ log(d0))$coefficients
    lines(d, exp(m[1] + m[2]*log(d)), col='blue', lwd=3)
    
    m <- lm(log(f0) ~ log(log(d0)))$coefficients
    lines(d, exp(m[1] + m[2]*log(log(d))), col='green', lwd=3)
    
    m <- lm(log(f0) ~ log(d0) + I(log(d0)^2))$coefficients
    lines(d, exp(m[1] + m[2]*log(d) + m[3]*log(d)^2), col='red', lwd=3)
    
    m <- lm(f0 ~ d0 + I(d0^2))$coefficients
    lines(d, m[1] + m[2]*d + m[3]*d^2, col='pink', lwd=3)
    

    enter image description here 由此我可以看出红色更好。

    从下面的精彩答案来看,这并不是一件小事,所以就我个人而言,我将坚持使用手动方法。这应该是可能的,因为公式保存在 model$call 中,但我可以没有它。

    最佳答案

    plotFromModel 假设模型具有可能转换的 y 值和单个 x 值;但是,x 值可以包含在多个 lm 项中,并且每个项都可以转换 xfinv 必须指定 LHS 的逆变换(如果 y 未变换,则可以省略)。如果 add 为 FALSE(默认值),它将绘制 yx 的对比,然后绘制拟合。如果 add 为 TRUE,则仅绘制覆盖任何现有图的拟合图。 ...传递给绘制拟合的lines命令。请注意,它会 retrofit 模型。

    此外,请注意,使用传统的线性回归测试无法比较不同的拟合,因为它们使用 y 的不同函数的平方和。

    plotFromModel <- function(x, fm, finv = identity, add = FALSE, ...) {
    
       # DF's columns are y and x
       DF <- cbind(finv(fm$model[1]), x)
       names(DF) <- all.vars(terms(fm))
    
       if (!add) plot(DF[2:1]) # plot y vs. x
       fm.new <- lm(terms(fm), DF) # refit using new x
       lines(finv(fitted(fm.new)) ~ x, ...)
    }
    
    d0 = c(1,2,3,4,5) 
    f0 = c(0.8950514, 1.240066, 1.410252, 1.494778, 1.514794)
    
    fm0 <- lm(f0 ~ d0)  
    fm1 <- lm(log(f0) ~ log(d0))
    fm2 <- lm(log(f0) ~ log(d0) + I(log(d0)^2))
    fm3 <- lm(f0 ~ d0 + I(d0^2))
    
    plotFromModel(d0, fm0, col = 1)
    plotFromModel(d0, fm1, exp, add = TRUE, col = 2, lty = 2)
    plotFromModel(d0, fm2, exp, add = TRUE, col = 3, lty = 3)
    plotFromModel(d0, fm3, add = TRUE, col = 4, lty = 4)
    

    screenshot

    关于r - 绘制 lm 返回的模型的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35601752/

    相关文章:

    r - 显示方位和距离的圆图

    javascript - 我怎样才能用 flot 只绘制点(而不是线)?

    javascript - 如何计算贝塞尔曲线上的控制点?

    r - dplyr `mutate` 使用两次时返回错误

    r - R 上的 ggplot 问题 : code is correct but I keep receiving the error "Must request at least one color from a hue palette"

    r - 使用 R 为数据框中的每一行绘制雷达图

    python - 绘制函数的输出会给出此错误-TypeError : unhashable type: 'numpy.ndarray'

    python - 如何对 SciPy 曲线拟合施加约束?

    python - 将线性函数拟合到一组数据后,如何找到函数梯度上的​​误差?

    reshape 数据框中的列