R ggplot2:如何绘制正交回归线?

R ggplot2:如何绘制正交回归线?,r,ggplot2,regression,R,Ggplot2,Regression,我已经在两个不同的视觉感知测试中测试了一个大样本的参与者——现在,我想看看这两个测试的表现在多大程度上相互关联 为了可视化相关性,我使用ggplot()在R中绘制了一个散点图,并拟合了一条回归线(使用stat\u smooth())。但是,由于我的x和y变量都是性能度量,因此在拟合回归线时,我需要考虑这两个变量–因此,我不能使用简单的线性回归(使用stat\u smooth(method=“lm”)),而是需要拟合正交回归(或总最小二乘)。我该怎么做呢 我知道我可以在stat\u smooth(

我已经在两个不同的视觉感知测试中测试了一个大样本的参与者——现在,我想看看这两个测试的表现在多大程度上相互关联

为了可视化相关性,我使用
ggplot()
在R中绘制了一个散点图,并拟合了一条回归线(使用
stat\u smooth()
)。但是,由于我的
x
y
变量都是性能度量,因此在拟合回归线时,我需要考虑这两个变量–因此,我不能使用简单的线性回归(使用
stat\u smooth(method=“lm”)
),而是需要拟合正交回归(或总最小二乘)。我该怎么做呢


我知道我可以在
stat\u smooth()
中指定
formula
,但我不知道该使用什么公式。据我所知,所有预设方法(
lm、glm、gam、黄土、rlm
)均不适用。

注意:不熟悉此方法

我认为您应该能够将
坡度
截距
传递到
geom\u abline
以生成装配线。或者,您可以定义自己的方法传递到
stat\u smooth
(如链接所示)。我使用了链接中建议的
MethComp
包中的
Deming
功能

库(MethComp)
图书馆(GG2)
#样本数据和模型(来自Deming示例)
种子(1)

M可以从(x,y)的主成分分析中提取斜率和截距,如图所示。这只是简单了一点,在base R中运行,并给出了与在
MethComp
中使用
Deming(…)
相同的结果

# same `x and `y` as @user20650's answer
df  <- data.frame(y, x)
pca <- prcomp(~x+y, df)
slp <- with(pca, rotation[2,1] / rotation[1,1])
int <- with(pca, center[2] - slp*center[1])

ggplot(df, aes(x,y)) + 
  geom_point() + 
  stat_smooth(method=lm, color="green", se=FALSE) +
  geom_abline(slope=slp, intercept=int, color="blue")
#与@user20650的答案相同的'x和'y'

df似乎不再维护
MethComp
包(已从CRAN中删除)。 允许使用
stat\u
/
geom\u summary
method=“tls”
添加正交回归线

基于此,我创建了以下函数,允许使用除1以外的噪声比:



deming.fit您可以将
斜率
截距
从您的模型传递到
geom_abline
,或者您可以使用显示的方法创建自己的methodGreat方法,同时避免额外的包。另一个问题,也许更符合美学,是如何将
geom_abline()
的长度限制为数据,比如
stat_smooth()
?当前,
geom\u abline()
一直延伸到绘图上,而不管数据点是否一直延伸到绘图上。一种方法是使用
geom\u段
。您知道数据中x范围的最小值和最大值,因此使用斜率和截距计算这些极限处的y值,然后使用
geom_段
绘制线。或者您可以在下面的函数
f
中用nice
prcomp
方法替换
Deming
函数。您知道为什么在
noise\u ratio=1
下使用函数计算的置信区间与COEF::tls方法产生的置信区间略有不同吗?另外,答案很漂亮,因为它是唯一包含置信区间的答案。非常感谢。它们是用引导估计的,因此是随机的,您可以尝试增加引导样本的数量(
R
),并检查这是否有助于使它们更相似!让我知道是否存在系统性差异!哦,你说得对!在两次运行之间,间隔略有变化。谢谢。像这样扩展geom_smooth是作者()所不鼓励的(但我不确定替代方案是什么)。要解决predictdf y ggplot2的非导出问题,可以使用注册表3方法(“predictdf”,“YourClass”,yourpackage::predictdf.YourClass,envir=environment(ggplot2::predictdf))
在您的包的
.on.load
中。
# same `x and `y` as @user20650's answer
df  <- data.frame(y, x)
pca <- prcomp(~x+y, df)
slp <- with(pca, rotation[2,1] / rotation[1,1])
int <- with(pca, center[2] - slp*center[1])

ggplot(df, aes(x,y)) + 
  geom_point() + 
  stat_smooth(method=lm, color="green", se=FALSE) +
  geom_abline(slope=slp, intercept=int, color="blue")