在R中的最小二乘回归图中绘制垂直偏移量
Posted
技术标签:
【中文标题】在R中的最小二乘回归图中绘制垂直偏移量【英文标题】:Graphing perpendicular offsets in a least squares regression plot in R 【发布时间】:2011-02-08 00:38:21 【问题描述】:我有兴趣制作一个带有最小二乘回归线和将数据点连接到回归线的线段的图,如下图所示,称为垂直偏移: http://mathworld.wolfram.com/LeastSquaresFitting.html (来自 MathWorld - A Wolfram 网络资源:wolfram.com)
我在这里完成了绘图和回归线:
## Dataset from http://www.apsnet.org/education/advancedplantpath/topics/RModules/doc1/04_Linear_regression.html
## Disease severity as a function of temperature
# Response variable, disease severity
diseasesev<-c(1.9,3.1,3.3,4.8,5.3,6.1,6.4,7.6,9.8,12.4)
# Predictor variable, (Centigrade)
temperature<-c(2,1,5,5,20,20,23,10,30,25)
## For convenience, the data may be formatted into a dataframe
severity <- as.data.frame(cbind(diseasesev,temperature))
## Fit a linear model for the data and summarize the output from function lm()
severity.lm <- lm(diseasesev~temperature,data=severity)
# Take a look at the data
plot(
diseasesev~temperature,
data=severity,
xlab="Temperature",
ylab="% Disease Severity",
pch=16,
pty="s",
xlim=c(0,30),
ylim=c(0,30)
)
abline(severity.lm,lty=1)
title(main="Graph of % Disease Severity vs Temperature")
我应该使用某种 for 循环和段 http://www.iiap.res.in/astrostat/School07/R/html/graphics/html/segments.html 来进行垂直偏移吗?有没有更有效的方法?如果可能,请提供一个示例。
【问题讨论】:
【参考方案1】:您首先需要计算出垂直线段的底坐标,然后调用segments
函数,该函数可以将坐标向量作为输入(无需循环)。
perp.segment.coord <- function(x0, y0, lm.mod)
#finds endpoint for a perpendicular segment from the point (x0,y0) to the line
# defined by lm.mod as y=a+b*x
a <- coef(lm.mod)[1] #intercept
b <- coef(lm.mod)[2] #slope
x1 <- (x0+b*y0-a*b)/(1+b^2)
y1 <- a + b*x1
list(x0=x0, y0=y0, x1=x1, y1=y1)
现在只需调用段:
ss <- perp.segment.coord(temperature, diseasesev, severity.lm)
do.call(segments, ss)
#which is the same as:
segments(x0=ss$x0, x1=ss$x1, y0=ss$y0, y1=ss$y1)
请注意,除非您确保绘图的 x 单位和 y 单位具有相同的表观长度(等轴测比例),否则结果看起来不会垂直。为此,您可以使用pty="s"
得到一个正方形图并将xlim
和ylim
设置为相同的范围。
【讨论】:
以上是关于在R中的最小二乘回归图中绘制垂直偏移量的主要内容,如果未能解决你的问题,请参考以下文章