3

我有这个数据框:

> 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)

在此处输入图像描述

但我需要的是使用yerr来拟合我的线性模型。ggplot2可以吗?

4

3 回答 3

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)

在此处输入图像描述

于 2013-02-01T12:11:45.127 回答
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
于 2013-02-01T18:47:38.327 回答
1

你的问题有点含糊。这里有一些建议可以帮助您入门。

  1. ggplot2 只是使用lm回归函数。要获取值,只需执行以下操作:

     lm(y ~ x, data=dat)
    

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

  2. stat_smooth您可以在usingse参数中关闭标准错误:

    .... + 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))
    
于 2013-02-01T09:07:46.103 回答