在R中绘制线性模型(lm)对象的机制?

时间:2013-10-15 03:31:05

标签: r plot visualization linear-regression lm

示例:

x <- c(1,2,5,6)
y <- c(3,5,2,9)
m <- lm(y ~ x)
plot(m)

plot(m)将吐出一系列情节。我的问题是,我怎么知道它会喷出什么样的情节? Paul Teetor的书如何知道写plot(m, which=1)来选择残差图? ls.str(m)在这里显得毫无用处。

我的猜测是lm类具有为plot()函数定义的某种接口,但我不知道如何获取有关其工作原理或可用图表的任何信息(除了输入{ {1}}并写下黑匣子吐出的内容。)

2 个答案:

答案 0 :(得分:3)

此页

http://stat.ethz.ch/R-manual/R-patched/library/stats/html/plot.lm.html

解释了6个情节。

第一个是残差,与您的示例中的which=1相对应。以下是该页面的引用:

Six plots (selectable by which) are currently available: a plot of residuals against fitted values, a Scale-Location plot of sqrt(| residuals |) against fitted values, a Normal Q-Q plot, a plot of Cook's distances versus row labels, a plot of residuals against leverages, and a plot of Cook's distances against leverage/(1-leverage). By default, the first three and 5 are provided.

我希望网页是朝着正确的方向迈出的一步。

答案 1 :(得分:3)

您提到“lm类具有为plot()函数定义的某种接口”。实际上,这是R中的S3机制,它遵循“method.class”命名约定。此处,方法为plot,类为lm。您无需键入plot.lm即可获得这些图表。当你调用plot时,R将首先检查第一个参数的类类型,并将它(在这种情况下为m)命名为类lm;然后R自动调用plot.lm函数。

对于plot方法,您可以通过在R中键入methods(plot)来看到它适用于更多类:

 [1] plot.acf*           plot.data.frame*    plot.decomposed.ts* plot.default        plot.dendrogram*   
 [6] plot.density        plot.ecdf           plot.factor*        plot.formula*       plot.function      
[11] plot.gofm*          plot.gofv*          plot.hap.score*     plot.hclust*        plot.histogram*    
[16] plot.HoltWinters*   plot.isoreg*        plot.lm             plot.md             plot.medpolish*    
[21] plot.mlm            plot.ppr*           plot.prcomp*        plot.princomp*      plot.profile.nls*  
[26] plot.spec           plot.spline*        plot.stepfun        plot.stl*           plot.table*        
[31] plot.ts             plot.tskernel*      plot.TukeyHSD       plot.xyVector*     

   Non-visible functions are asterisked

您看到plot.lm就是其中之一。要了解其中任何一项,您可以使用fix(plot.lm)。然后你会注意到第一行:

caption = list("Residuals vs Fitted", 
    "Normal Q-Q", "Scale-Location", "Cook's distance", "Residuals vs Leverage", 
    expression("Cook's dist vs Leverage  " * h[ii]/(1 - h[ii])))

显然,当你在类plot的对象上调用lm时,你会知道构建了哪些图:)希望这会有所帮助!