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
中用niceprcomp
方法替换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")