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

jbs*_*ssm 3 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
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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

jbs*_*ssm 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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


Rei*_*son 6

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

对于示例/情况ggplotgeom_smooth为你做以下.惠斯特似乎更容易使用geom_Smooth,直接拟合模型的好处最终超过了这一点.例如,您拥有合适的模型,可以对模型的拟合,假设等进行诊断.

适合加权最小二乘法

mod <- lm(y ~ x, data = dat, weights = 1/sqrt(yerr))
Run Code Online (Sandbox Code Playgroud)

然后predict()从范围内的模型x

newx <- with(dat, data.frame(x = seq(min(x), max(x), length = 50)))
pred <- predict(mod, newx, interval = "confidence", level = 0.95)
Run Code Online (Sandbox Code Playgroud)

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

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

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

接下来,构建情节

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
Run Code Online (Sandbox Code Playgroud)