简体   繁体   English

在R中的最小二乘回归图中绘制垂直偏移

[英]Graphing perpendicular offsets in a least squares regression plot in R

I'm interested in making a plot with a least squares regression line and line segments connecting the datapoints to the regression line as illustrated here in the graphic called perpendicular offsets: http://mathworld.wolfram.com/LeastSquaresFitting.html 我有兴趣制作一个带有最小二乘回归线和连接数据点与回归线的线段的图,如图所示,称为垂直偏移: http//mathworld.wolfram.com/LeastSquaresFitting.html 替代文字
(from MathWorld - A Wolfram Web Resource: wolfram.com ) (来自MathWorld - Wolfram Web资源: wolfram.com

I have the plot and regression line done here: 我在这里完成了情节和回归线:

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

Should I use some kind of for loop and segments http://www.iiap.res.in/astrostat/School07/R/html/graphics/html/segments.html to do the perpendicular offsets? 我应该使用某种for循环和细分http://www.iiap.res.in/astrostat/School07/R/html/graphics/html/segments.html来做垂直偏移吗? Is there a more efficient way? 有更有效的方法吗? Please provide an example if possible. 如果可能,请提供一个示例。

You first need to figure out the coordinates for the base of the perpendicular segments, then call the segments function which can take vectors of coordinates as inputs (no need for a loop). 首先需要找出垂直段基础的坐标,然后调用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)
}

Now just call segments: 现在只需呼叫段:

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)

Note that the results will not look perpendicular unless you ensure that the x-unit and y-unit of your plot have the same apparent length (isometric scales). 请注意,除非确保绘图的x单位和y单位具有相同的表观长度(等距刻度),否则结果将不会垂直。 You can do that by using pty="s" to get a square plot and set xlim and ylim to the same range. 您可以通过使用pty="s"来获得方形图并将xlimylim设置为相同的范围。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM