R 在相关图中识别CI之外的数据点

R 在相关图中识别CI之外的数据点,r,ggplot2,R,Ggplot2,我正在寻找最有效的方法来识别/提取相关图中CI阴影之外的数据点,如下图所示: ggplot(df,aes(x,y))+geom_point()+ stat_smooth(method = "lm", formula = y~poly(x, 2), size = 1, se = T, level = 0.99) 我希望能够保存一个新变量,该变量标记落在外部的数据点,如下所示: x y group 1: 0.0 0.00 1 2: 0.5 0.40

我正在寻找最有效的方法来识别/提取相关图中CI阴影之外的数据点,如下图所示:

ggplot(df,aes(x,y))+geom_point()+
stat_smooth(method = "lm", formula = y~poly(x, 2), size = 1, se = T, level = 0.99)

我希望能够保存一个新变量,该变量标记落在外部的数据点,如下所示:

    x     y      group
1:  0.0  0.00     1
2:  0.5  0.40     1
3:  0.9  0.70     1
4:  1.0  1.30     1
5:  2.0  6.60     0
6:  3.0  3.10     1
7:  4.0  4.40     1
8:  5.0  5.90     1
9:  6.0  6.05     1
10: 7.0  7.60     1
11: 8.0  8.00     1
12: 9.0  2.90     0
13: 10.0 13.80    1
14: 11.0 13.40    1
15: 12.0 14.90    1
原始数据:

df <- data.table("x"=c(0,0.5,0.9,1,2,3,4,5,6,7,8,9,10,11,12), 
      "y"=c(0,0.4,0.7,1.3,6.6,3.1,4.4,5.9,6.05,7.6,8,2.9,13.8,13.4,14.9))
df2 <- data.table("x"=c(0,0.5,0.9,1,2,3,4,5,6,7,8,9,10,11,12), 
       "y"=c(0,0.4,0.7,1.3,6.6,3.1,4.4,5.9,6.05,7.6,8,2.9,13.8,13.4,14.9), 
       "group" = c(1,1,1,1,0,1,1,1,1,1,1,0,1,1,1))

df首先,我们将对与平滑拟合对应的数据运行线性模型
lm()
x+I(x^2)
与刚刚写出的
poly(x,2)
是一样的。然后,我们使用该模型的预测来扩充原始数据,这些预测将被命名为
.fitted、.resid、.se.fit
。然后我们可以创建一个新的变量,称为
group
,这是一个逻辑测试:观察到的
y
和预测的
.fitted
之间的距离是否大于拟合标准误差的2.58倍?这大致相当于平滑线的99%置信区间

require(broom)
require(dplyr)

df %>% 
  do(augment(lm(y ~ x + I(x^2), data = .))) %>%
  mutate(group = as.numeric(abs(y - .fitted) > 2.58*.se.fit))
为了好玩,我们可以查看您的数据,只需通过
变量对点进行不同的着色:

df %>% 
  do(augment(lm(y ~ x + I(x^2), data = .))) %>%
  mutate(group = as.numeric(abs(y - .fitted) < 2.58*.se.fit)) %>%
  ggplot(aes(x, y)) + geom_point(aes(colour = factor(group)), size = 4) +
  stat_smooth(method = "lm", formula = y ~ poly(x, 2), size = 1, level = .99)
df%>%
do(增加(lm(y~x+I(x^2),数据=))%>%
变异(组=数值型(abs(y-拟合)<2.58*.se.拟合))%>%
ggplot(aes(x,y))+几何点(aes(颜色=因子(组)),尺寸=4)+
统计平滑(method=“lm”,formula=y~poly(x,2),size=1,level=0.99)


编辑以澄清
该问题询问了99%置信区间。我错误地将“3”作为z分数来标记置信区间以外的点。它实际上是
2.58*.se.fit
。对于95%的CI,它将是1.96(~2)。

不确定如何使用ggplot实现这一点。但您也可以重新运行
lm
回归,并从中推断出置信区间以外的点

df$group=rep(1,nrow(df))
lm1=lm(y~poly(x,2),df)
p1=predict(lm1,interval="confidence",level=0.99)
df$group[df$y<p1[,2] | df$y>p1[,3]]=0
df$group=rep(1,nrow(df))
lm1=lm(y~poly(x,2),df)
p1=预测(lm1,区间=“置信度”,水平=0.99)
df$group[df$yp1[,3]]=0

perfect的可能副本!谢谢@Neilfwst这太好了。很好,很容易理解正在做的事情。谢谢@Lamianeat,虽然有点太高级了,我无法完全理解这些步骤,但谢谢你!对不起,我写得有点匆忙。我将用注释对其进行编辑。@Brian嗨,Brian,我无法理解你回答中关于观察到的y和预测的部分。拟合大于拟合标准误差的3倍?这大致相当于平滑线的99%置信区间。
是什么意思?
我们如何确定这方面的95%置信区间乘数?@Brian感谢您的回答。我在这里有点迷路了。我查看数据并检查了abs(y-已安装)
。如果我将2.96*SE放入组,则右上侧的一个数据在CI 95%之外。我不知道你是否打错了2.96?因为在[这里]()表中,它是说数字应该是1.96?我仍然无法理解这3在您的解决方案中来自何处?2.96是我混合了95%和99%的置信区间。99%的人的z值为2.58,95%的人的z值为1.96。谢谢你抓住我的错误!