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

标签 r statistics plot linear-regression least-squares

我有兴趣制作一个带有最小二乘回归线和将数据点连接到回归线的线段的图,如此处称为垂直偏移的图形所示:
http://mathworld.wolfram.com/LeastSquaresFitting.html
alt text
(来自 MathWorld - 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做垂直偏移?有没有更有效的方法?如果可能,请提供一个例子。

最佳答案

您首先需要找出垂直线段底部的坐标,然后调用 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" 来做到这一点。得到一个方形图并设置 xlimylim到相同的范围。

关于r - 在 R 中的最小二乘回归图中绘制垂直偏移量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2639430/

相关文章:

python - 解释跨文档单词的 TF-IDF 分数总和

python - 如何在每个波段/箱中以数据百分比作为标签绘制正态分布?

r - 在 R 中绘制数据;错误 : default method not implemented for type 'list'

plot - 如何在 Julia 中绘制 .txt 中的值

c++ - 在使用 Rcpp 时从 C++ 调用 GLPK

xml - R & XML2 : Replace missing XML elements with NA

r - 为模型选择实现 LOOCV(不使用 caret 包)

r 生成具有给定概率的随机二元结果

r - 比较 Octave ML 结果与R结果

javascript - 绘制点,以便它们在具有相同坐标时不会重叠