我该如何在ggplot2 qplot上叠加修改后的loess线?

9

背景

目前,我正在创建一个多预测变量的线性模型,并生成诊断图以评估回归假设。这是我目前热爱的多元回归分析统计课程的一部分 :-)

我的教科书(Cohen,Cohen,West和Aiken 2003)建议绘制每个预测变量与残差的图形,以确保:

  1. 残差不会与预测变量系统地共变
  2. 残差在模型中各个预测变量方面是同方差的

关于第二点,我的教科书有这样的说法:

一些统计软件包允许分析人员在残差均值(0线)、均值加1标准差和均值减1标准差处绘制lowess拟合线....在当前案例中,两条线(均值加1标准差和均值减1标准差)大致平行于lowess(0)线,这表明残差的方差不随X的变化而改变。(第131页)

如何修改loess线?

我知道如何生成带“0线”的散点图:

    # First, I'll make a simple linear model and get its diagnostic stats
    library(ggplot2)
    data(cars)
    mod <- fortify(lm(speed ~ dist, data = cars))
    attach(mod)
    str(mod)

    # Now I want to make sure the residuals are homoscedastic
    qplot (x = dist, y = .resid, data = mod) + 
    geom_smooth(se = FALSE) # "se = FALSE" Removes the standard error bands

但是,有没有人知道我如何使用ggplot2qplot生成图形,其中0线,“平均值+1标准差”和“平均值-1标准差”线条将被叠加?这是一个奇怪/复杂的问题吗?


说实话,我对ggplot2并没有特别执着。只是我发现它是一个非常直观和强大的数据显示包,尤其因为我是一个R新手 :-) - briandk
我不确定你想要什么。那不就是一个68%的置信区间吗?我一直被教导绘制绝对残差和loess曲线。这是一种更简单的检查方法,可以检测到方差的变化。 - hadley
Hadley - 我的书提供了一个同方差性的例子,以及两个异方差性的例子:http://picasaweb.google.com/brian.danielak/HomoscedasticityPlots?feat=directlink在第二和第三张照片中,loess的0线几乎没有晃动,但+1sd和-1sd线揭示了残差中的模式。当然,在没有任何loess的情况下,这些模式也是可见的,但如果它们在图中不太明显怎么办?我无法确定我的问题是在编码级别还是在概念统计水平上。鉴于这些图片中的数据,您会如何考虑评估同方差性? - briandk
Hadley,如果我错了,请纠正我,但我认为loess的标准误差是在假定同方差性(通过residual.scale)的情况下计算的。Briandk,这并没有回答你的问题,但我会使用类似以下的代码:qplot(x = dist,y = abs(.resid),data = mod)+ geom_smooth(),如果线不是平的,则使用hccm。 - Ian Fellows
我真希望2小时前就知道了fortify()。 - Matt Parker
@Matt - 好消息是现在你知道了! - briandk
3个回答

4

道歉

各位,我想为我的无知道歉。Hadley是绝对正确的,答案一直在我眼前。正如我所怀疑的那样,我的问题源于统计学上的无知,而不是程序上的无知。

我们免费获得了68%的置信区间

geom_smooth()默认使用loess平滑,并将+1sd和-1sd线条叠加在一起作为交易的一部分。这就是Hadley说“这不仅是68%的置信区间吗?”的意思。我完全忘记了这就是68%区间的含义,并一直在寻找我已经知道如何做的事情。由于我实际上通过指定geom_smooth(se = FALSE)关闭了置信区间,这并没有帮助我。

我的示例代码应该是这样的

# First, I'll make a simple linear model and get its diagnostic stats.
library(ggplot2)
data(cars)
mod <- fortify(lm(speed ~ dist, data = cars))
attach(mod)
str(mod)

# Now I want to make sure the residuals are homoscedastic.
# By default, geom_smooth is loess and includes the 68% standard error bands.
qplot (x = dist, y = .resid, data = mod) + 
geom_abline(slope = 0, intercept = 0) +
geom_smooth() 

我学到了什么

Hadley实现了一种非常漂亮且简单的方式,以获得我一直想要的东西。但是,由于我专注于loess线,我忽视了68%置信区间被我需要的那些线所限制这个事实。对不起给大家带来麻烦。


好的,我之前觉得问题有点奇怪 :-). 不管怎么样,感谢你让它更清楚了。 - dalloliogm

1
您可以计算数据的+/-标准差,并将其拟合曲线添加到图中吗?

好的建议,但我认为它可能不太可行。Cohen等人(2003)补充道:“另外两条线{平均值+1sd和平均值-1sd}是使用lowess过程创建的,以估计低于和高于lowess线1个标准偏差的值。”由于(似乎)在lowess算法中,sd计算实际上是逐点计算,我不确定您的建议是否能准确地产生我们想要的结果。如果您的意思是计算数据集的sd,然后从lowess估计中加/减该值,那将创建曲线的精确副本 :-( - briandk
啊,我明白了...谢谢你的解释。ggplot2建议的另一个好来源是ggplot2@googlegroups.com,所以如果你在这里没有解决你的问题,那也是一个选择(同时ggplot2标签也存在)。 - djq

1

请看一下我的问题 "修改 lm 或 loess 函数.."

我不太确定我是否理解了你的问题,但也许可以:

+ stat_smooth(method=yourfunction)

只要您按照此处描述定义函数,它就能正常工作。


@dalloliogm - 感谢您的建议!事实证明(请参见下文),我甚至不需要指定自定义的 yourfunction,因为 geom_smooth() 的默认置信区间正好被我一直试图绘制的线所限制。 - briandk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接