使用ggplot2中的smooth使用数据中给出的错误拟合线性模型

时间:2013-01-31 22:07:37

标签: r ggplot2

我有这个数据框:

> dat
   x         y        yerr
1 -1 -1.132711 0.001744498
2 -2 -2.119657 0.003889120
3 -3 -3.147378 0.007521881
4 -4 -4.220129 0.012921450
5 -5 -4.586586 0.021335644
6 -6 -5.389198 0.032892630
7 -7 -6.002848 0.048230946

我可以用标准误差平滑绘制它:

p <- ggplot(dat, aes(x=x, y=y)) + geom_point()
p <- p + geom_errorbar(data=dat, aes(x=x, ymin=y-yerr, ymax=y+yerr), width=0.09)
p + geom_smooth(method = "lm", formula = y ~ x)

enter image description here

但我需要的是使用 yerr 来适应我的线性模型。是否可以使用ggplot2?

3 个答案:

答案 0 :(得分:7)

好吧,我找到了回答这个问题的方法。

由于在我们收集数据的任何科学实验中,如果正确执行该实验,则所有数据值都必须存在关联错误。

在某些情况下,错误的方差在所有点上可能相等,但在很多情况下,如原始问题中的当前情况状态,这是不正确的。所以我们必须使用在将曲线拟合到我们的数据时,不同测量值的误差值的方差不同。

这样做的方法是将权重归因于错误值,根据统计分析方法等于1 / sqrt(errorValue),因此,它变为:

p <- ggplot(dat, aes(x=x, y=y, weight = 1/sqrt(yerr))) + 
    geom_point() + 
    geom_errorbar(aes(ymin=y-yerr, ymax=y+yerr), width=0.09) + 
    geom_smooth(method = "lm", formula = y ~ x)

enter image description here

答案 1 :(得分:6)

对于任何模型拟合,我会在我正在使用的绘图范例之外进行拟合。为此,将值传递给weights,该值与观察值的方差成反比。然后通过加权最小二乘法完成拟合。

对于您的示例/情况 ggplot geom_smooth正在为您执行以下操作。惠斯特似乎更容易使用geom_Smooth,直接拟合模型的好处最终会超过这个。例如,您拥有合适的模型,可以对模型的拟合,假设等进行诊断。

适合加权最小二乘法

mod <- lm(y ~ x, data = dat, weights = 1/sqrt(yerr))

然后在predict()

的范围内从模型中x
newx <- with(dat, data.frame(x = seq(min(x), max(x), length = 50)))
pred <- predict(mod, newx, interval = "confidence", level = 0.95)

在上面我们使用predict.lm方法生成适当的置信区间以供使用。

接下来,准备用于绘图的数据

pdat <- with(data.frame(pred),
             data.frame(x = newx, y = fit, ymax = upr, ymin = lwr))

接下来,构建情节

require(ggplot2)
p <- ggplot(dat, aes(x = x, y = y)) +
       geom_point() +
       geom_line(data = pdat, colour = "blue") + 
       geom_ribbon(mapping = aes(ymax = ymax, ymin = ymin), data = pdat, 
                   alpha = 0.4, fill = "grey60")
p

答案 2 :(得分:1)

你的问题有点模糊。以下是一些可以帮助您入门的建议。

  1. ggplot2只是使用lm函数进行回归。要获得这些值,请执行以下操作:

     lm(y ~ x, data=dat)
    

    这将为您提供y轴截距和渐变。

  2. 您可以使用stat_smooth参数关闭se中的标准错误:

    .... + geom_smooth(method = "lm", formula = y ~ x, se = FALSE) 
    
  3. 您可以使用以下内容在点/错误带中添加功能区:

    ##This doesn't look good. 
    .... + geom_ribbon(aes(x=x, ymax =y+yerr, ymin=y-yerr))