识别相关图中位于CI之外的数据点

时间:2017-05-01 00:40:57

标签: 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)

sample plot

我希望能够保存一个新变量,该变量标记出的数据点如下:

    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))

2 个答案:

答案 0 :(得分:5)

不确定如何使用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

答案 1 :(得分:3)

首先,我们会在您的数据上运行与您的平滑拟合相对应的线性模型lm()x + I(x^2)poly(x, 2)完全相同,只是写出来了。然后我们augment原始数据与该模型的预测,这些预测将是名为.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))

对于funsies,我们可以查看您的数据,只是通过group变量对点进行不同的着色:

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)

enter image description here

编辑澄清

有关99%CI的问题。我误认为&#34; 3&#34;作为z分数来标记置信区间之外的点。它实际上是2.58*.se.fit。对于95%CI,它将是1.96(~2)。