从散点图中找到 2 个回归方程/斜率并比较方程/斜率
Posted
技术标签:
【中文标题】从散点图中找到 2 个回归方程/斜率并比较方程/斜率【英文标题】:Finding 2 regression equations/slopes and comparing equations/slopes from a scatter plot 【发布时间】:2021-01-11 01:47:59 【问题描述】:我在 R 中使用 iris 数据集。我过滤了数据集,因此 iris$Species == setosa 或 versicolor。然后我创建了一个散点图,其中 x 轴是 Sepal.Length,y 轴是 Sepal.Width。点按物种高亮显示,并在散点图中按物种添加2条不同的线性回归线。
这是我的问题:
-
是否可以从散点图中获取 2 条线(setosa 或 versicolor)的斜率方程/斜率值?如果有,怎么做?
是否可以使用统计检验来查看 2 条线(setosa 或 versicolor)的斜率方程/斜率值是否存在显着差异?
如果/何时可以,请告诉我。
提前谢谢。
-附言
下图:
这是生成绘图的 R 代码:
# creates data for scatter plot
## dataset of interest
iris
## for iris
colnames (iris)
### creates dataset with just cases where iris$Species == setosa or versicolor
#### unique values for iris$Species
unique(iris$Species)
#### loads tidyverse package
library(tidyverse)
##### filters dataset with just cases where iris$Species == setosa or versicolor
iris__setosa_or_versicolor <- iris %>% filter(iris$Species != "virginica")
##### turns iris__setosa_or_versicolor to dataframe
iris__setosa_or_versicolor <- data.frame(iris__setosa_or_versicolor)
##### unique values for iris__setosa_or_versicolor$Species
unique(iris__setosa_or_versicolor$Species)
## creates scatter plot
### loads ggplot2
library(ggplot2)
### Basic scatter plot
scatter_plot__sepal_length_x_sepal_width__points_is_species <- ggplot(iris__setosa_or_versicolor, aes(x=Sepal.Length, y=Sepal.Width)) + geom_point()
scatter_plot__sepal_length_x_sepal_width__points_is_species
### Basic scatter plot with regression line added
scatter_plot__sepal_length_x_sepal_width__points_is_species <- ggplot(iris__setosa_or_versicolor, aes(x=Sepal.Length, y=Sepal.Width)) + geom_point() + geom_smooth(method=lm, se=FALSE, color="green")
scatter_plot__sepal_length_x_sepal_width__points_is_species
### Basic scatter plot separated by Species
scatter_plot__sepal_length_x_sepal_width__points_is_species <- ggplot(iris__setosa_or_versicolor, aes(x=Sepal.Length, y=Sepal.Width, color=Species, shape=Species)) + geom_point() + geom_smooth(method=lm, se=FALSE, fullrange=TRUE) + labs(title="Scatter plot of Sepal.Length X Sepal.Width with dots as Species where Species is setosa or versicolor", x="Sepal.Length", y = "Sepal.Width") + scale_colour_manual(values = c("#ff0000","#0000ff"))
scatter_plot__sepal_length_x_sepal_width__points_is_species
scatter_plot__sepal_length_x_sepal_width__points_is_species <-
scatter_plot__sepal_length_x_sepal_width__points_is_species + theme(panel.background = element_rect(fill = "white", colour = "white", size = 0.5, linetype = "solid"), panel.grid.major = element_line(size = 0.5, linetype = 'solid', colour = "lightblue"), panel.grid.minor = element_line(size = 0.25, linetype = 'solid', colour = "lightblue"))
scatter_plot__sepal_length_x_sepal_width__points_is_species
scatter_plot__sepal_length_x_sepal_width__points_is_species <-
scatter_plot__sepal_length_x_sepal_width__points_is_species + geom_point(size=3)
scatter_plot__sepal_length_x_sepal_width__points_is_species
### displays scatter plot
scatter_plot__sepal_length_x_sepal_width__points_is_species
编辑 1:
对评论的回应:
你在 2. 中是什么意思?您是否还想在图上添加测试结果作为注释?或者只是独立于图形比较斜率?请编辑您的问题。一旦清楚,我会回答。 (作为一般评论,请尽量避免在示例代码 sn-p 中包含与您的问题无关的详细信息,例如背景颜色和点大小的变化。)
我有兴趣比较独立于图形的斜率。我想看看回归线之间是否存在差异以及如何解释这些差异。
对答案的回应:
使用 lm 运行回归。
然后对这些回归使用 ANCOVA 来查看斜率差异。
谢谢。我想我已经按照你说的做了。将模型与没有交互的 v. 进行比较的方差分析表是显着的。我认为这意味着基于分组变量物种的回归斜率之间存在差异。这种解释正确吗?
代码如下。代码是否正确完成?
对此的后续问题:如何根据数据找到 2 条回归线 (iris$Species = setosa v. versicolor) 的斜率?
这是使用 ANCOVA 比较两个回归的代码:
## comparing the slopes of the regression lines using ANCOVA
# ---- NOTE: DV - Sepal.Width
# ---- NOTE: IV - Sepal.Length
# ---- NOTE: grouping variable: Species
# ---- NOTE: dataset: iris__setosa_or_versicolor
# ---- NOTE: based on this site: https://stats.stackexchange.com/questions/51780/how-to-perform-an-ancova-in-r
### create interaction_regression_model
interaction_regression_model <- aov(Sepal.Width~Sepal.Length*Species,data=iris__setosa_or_versicolor)
#### gives summary of interaction_regression_model
summary(interaction_regression_model)
### create no_interaction_regression_model
no_interaction_regression_model <- aov(Sepal.Width~Sepal.Length+Species,data=iris__setosa_or_versicolor)
#### gives summary of no_interaction_regression_model
summary(no_interaction_regression_model)
### compare 2 regression models, using ancova through anova command
anova(no_interaction_regression_model,interaction_regression_model)
【问题讨论】:
您可以使用“ggpmisc”包中的stat_poly_eq()
添加方程式。请参阅this old and popular question 的答案。也有使用其他方法的其他答案,但我更喜欢我在对前面问题的回答中描述的方法。
你在 2. 中是什么意思?您是否还想在图上添加测试结果作为注释?或者只是独立于图形比较斜率?请编辑您的问题。一旦清楚,我会回答。 (作为一般性评论,请尽量避免在示例代码中包含与您的问题无关的 sn-p 细节,例如背景颜色和点大小的变化。)
【参考方案1】:
要记住的是,绘图是绘图 - 这是一种帮助您可视化和理解数据的方法。它与数据本身不同。您无法像处理数据那样操作、转换、处理、转换或统计分析绘图。
同样,在绘图上绘制的回归线与线性回归不同。是的,绘图软件必须进行线性回归才能得到直线,但您不应该尝试从图中提取有关回归的信息。这是在倒退。如果要进行回归,请进行回归。
为使事情变得简单并与您的数据集等效,我们将从 iris 数据集中删除弗吉尼亚物种:
iris_filtered <- subset(iris, Species != "virginica", drop = TRUE)
现在我们根据Species
和Sepal.Length
对Sepal.Width
进行线性回归。我们使用函数 lm
来做到这一点。我们想知道Sepal.Length
的斜率在Species
之间是否不同,因此我们对它们之间的交互进行建模。以下行完成了所有这些操作:
model <- lm(Sepal.Width ~ Species * Sepal.Length, data = iris_filtered)
现在我们回顾一下我们的模型:
summary(model)
#> Call:
#> lm(formula = Sepal.Width ~ Species * Sepal.Length, data = iris_filtered)
#>
#> Residuals:
#> Min 1Q Median 3Q Max
#> -0.72394 -0.16281 -0.00306 0.15936 0.60954
#>
#> Coefficients:
#> Estimate Std. Error t value Pr(>|t|)
#> (Intercept) -0.5694 0.5352 -1.064 0.290049
#> Speciesversicolor 1.4416 0.6891 2.092 0.039069 *
#> Sepal.Length 0.7985 0.1067 7.487 3.41e-11 ***
#> Speciesversicolor:Sepal.Length -0.4788 0.1292 -3.707 0.000351 ***
#> ---
#> Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#>
#> Residual standard error: 0.2632 on 96 degrees of freedom
#> Multiple R-squared: 0.707, Adjusted R-squared: 0.6978
#> F-statistic: 77.2 on 3 and 96 DF, p-value: < 2.2e-16
这是这个模型告诉我们的:
setosa
线在 -0.5694cm 处与 y 轴相交,但 p 值与 0 没有显着差异 (p = 0.29)
versicolor
线与 y 轴相交,比 setosa
线高 1.4416 厘米,为 0.8722 厘米(-0.5694 + 1.4416 = 0.8722)。这种差异仅在 p = 0.039 时具有统计学意义。
setosa
物种的Sepal.Length
每增加 1cm,Sepal.Width
增加 0.7985cm。该斜率与 0 高度显着不同。
Sepal.Width
在Sepal.Length
(0.7985 - 0.4788 = 0.3917) 在物种versicolor
中每增加 0.3197 厘米。这与 setosa
(p = 0.000351) 的梯度有很大不同。
所以我们有我们的实际模型,以及它的梯度,我们知道斜率的差异很大并且我们用 3 行代码完成了它,和 我们不需要绘制任何东西。
只是为了证明这是可行的,让我们在数据上“手动”绘制这些线以显示回归的样子:
with(iris[iris$Species == "setosa",],
plot(Sepal.Length, Sepal.Width, col = "red", xlim = c(4, 7), ylim = c(2, 4.5)))
with(iris[iris$Species == "versicolor",],
points(Sepal.Length, Sepal.Width, col = "blue"))
abline(a = -0.5694, b = 0.7985, col = "red")
abline(a = 0.8722, b = 0.3197, col = "blue")
【讨论】:
谢谢。那真的很清楚。这是否意味着我们可以说模型 IV Sepal.Length 和 DV Sepal.Width 存在可归因于 Species 类型的差异?很抱歉这个基本问题。 是的@Mel - 这就是我们在这里所做的。如果你想知道物种之间是否只是萼片宽度不同,你的lm
模型公式就是Sepal.Width ~ Species
感谢您的澄清。【参考方案2】:
使用 lm 运行回归。
然后对这些回归使用 ANCOVA 来查看斜率差异。
【讨论】:
以上是关于从散点图中找到 2 个回归方程/斜率并比较方程/斜率的主要内容,如果未能解决你的问题,请参考以下文章