我用一条回归线为我的数据绘制了一个ggplot2的散点图,我注意到回归线与predict()的预测值不同.为何会是这样呢?请参见下面的示例:

# Make some data
set.seed(1)
n <- 100
df <- data.frame(x= rnorm(n, 100, 15), group= sample(0:1, n/2, replace= TRUE))
df$y <- df$x*.1 + df$group*2 + rnorm(n)

# Fit data and predict values
mod <- lm(y ~ x + group, df)
df_new <- setNames(data.frame(expand.grid(round(seq(min(df$x), max(df$x), 1), 0),
                                          0:1)),
                   nm= c("x", "group"))
df_pred <- cbind.data.frame(df_new, pred= predict(mod, df_new))

# Plot data with predicted values and geom_smooth()
library(ggplot2)
ggplot(df, aes(x, y, col= factor(group))) +
  geom_point() +
  geom_smooth(method= "lm", formula= "y ~ x") +
  geom_line(data=df_pred, mapping= aes(x, pred, col= factor(group)))

生成的曲线图为:

Plot

人们可以看到,预测的线与geom_smooth中的线不匹配.为什么?

旁注:有一个类似的question,但在这种情况下,这个人只是把变量搞混了.据我所知,在我的代码中情况并非如此.此外,对于生成的数据,这两行几乎都位于彼此之上,但在我的真实数据(我不能分享)中,不匹配的程度更大.

推荐答案

正如用户20650已经在 comments 中指出的那样,ggplot添加了一个交互术语,而您的模型mod只考虑了基于附加变量+ group的组差异.要获得相同的结果,要么使用交互术语* group,要么 for each 组创建两个不同的模型.请参阅下面的两种方法:

# Make some data
set.seed(1)
n <- 100
df <- data.frame(x= rnorm(n, 100, 15), group= sample(0:1, n/2, replace= TRUE))
df$y <- df$x*.1 + df$group*2 + rnorm(n)

# Fit data and predict values

# With interaction
mod <- lm(y ~ x * group, df) # <- add an interaction term
df_new <- setNames(data.frame(expand.grid(round(seq(min(df$x), max(df$x), 1), 0),
                                          0:1)),
                   nm= c("x", "group"))
df_pred <- cbind.data.frame(df_new, pred = predict(mod, df_new))


# Predict for each group
mod0 <- lm(y ~ x, df[df$group == 0, ]) 

df_new0 <- setNames(data.frame(expand.grid(round(seq(min(df$x), max(df$x), 1), 0),
                                          0)),
                   nm= c("x", "group"))


df_pred0 <- cbind.data.frame(df_new0, pred = predict(mod0, df_new0))

mod1 <- lm(y ~ x, df[df$group == 1, ])

df_new1 <- setNames(data.frame(expand.grid(round(seq(min(df$x), max(df$x), 1), 0),
                                           1)),
                    nm= c("x", "group"))

df_pred1 <- cbind.data.frame(df_new1, pred = predict(mod1, df_new1))

df_pred2 <- rbind(df_pred0, df_pred1)

# Plot data with predicted values and geom_smooth()
library(ggplot2)

ggplot(df, aes(x, y, col = factor(group))) +
  geom_point() +
  geom_smooth(method= "lm", formula= "y ~ x") +
  geom_line(data=df_pred, mapping= aes(x, pred, col = factor(group))) + # with interaction
  geom_line(data=df_pred2, mapping= aes(x, pred, col = factor(group))) # with seperate groups

R相关问答推荐

如何使用geom_sf在边界显示两种 colored颜色 ?

单击 map 后,将坐标复制到剪贴板

MCMC和零事件二元逻辑回归

在垂直轴中包含多个ggplot2图中的平均值

如何在R中添加截止点到ROC曲线图?

如何动态更新selectizeInput?

从BRM预测价值

如何在R中描绘#符号?

根据1个变量绘制 colored颜色 发散的 map ,由另一个变量绘制饱和度,ggplot2不工作

'使用`purrr::pwalk`从嵌套的嵌套框架中的列表列保存ggplots时出现未使用的参数错误

创建列并对大型数据集中的特定条件进行成对比较的更高效程序

为什么在写入CSV文件时Purrr::Pwalk不起作用

将统计检验添加到GGPUBR中的盒图,在R

在R中的数据框上使用Apply()函数时,如何保留非数字列?

如何根据其他列中的两个条件来计算数据帧中的行之间的差异?

如何在Quarto中使用美人鱼图表中的标记来加粗文本

注释不会绘制在所有ggplot2面上

需要一个函数来在第一行创建一个新变量,然后用新变量替换一个不同的变量(对于多行)

基于R中的引用将向量值替换为数据框列的值

将仪表板中的值框大小更改为Quarto