绘制lm返回的模型的结果

时间:2016-02-24 12:06:29

标签: 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中的信息?
  2. 我的愿望是这样的:

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

      看起来没有更明显的路径了。我在这里澄清一下,这个问题出于必要,为这5个点找到最合适的1d曲线。因此,虽然我们被迫使用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,但我可以没有它。

2 个答案:

答案 0 :(得分:2)

plotFromModel假定模型具有可能已转换的y值和单个x值;但是,x值可以包含多个lm字词,每个字词都可以转换为xfinv必须指定LHS的逆变换(或者如果未转换y则可以省略)。如果add为FALSE(默认值),则会将yx进行对比,然后拟合。如果add为TRUE,则仅绘制适合过度绘制任何现有图的拟合。 ...被传递给lines命令,用于绘制拟合。请注意,它会重新安装模型。

另外,请注意,使用传统线性回归测试不同的拟合是不可比的,因为它们使用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

答案 1 :(得分:0)

您可以使用预测将模型应用于数据。这是一个例子:

d0 = c(1,2,3,4,5)
f0 = c(0.8950514, 1.240066, 1.410252, 1.494778, 1.514794)
model <- lm(f0 ~ d0)

plot(d0, f0)
lines(d0, predict(model, data.frame(d0 = d0)))

也许有一种比创建数据框作为预测参数更优雅的方法,但它至少应该是一个充分的解决方案。