> summary(mydata)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0 93 107 110 125 197
> range=1.5*(125-93)
> upper_whisker=125+range
> lower_whisker=93-range
> upper_whisker
[1] 173
> lower_whisker
[1] 45
> boxplot(mydata)$stats
[,1]
[1,] 56 #Lower whisker by boxplot
[2,] 93
[3,] 107
[4,] 125
[5,] 173
我尝试查找用于在计算哪些值之前和之后将哪些值视为异常值的公式 是
Above =>3rd Qu +(3rd Qu - 1st Qu)*1.5
Below =>1st Qu -(3rd Qu - 1st Qu)*1.5
由于某些原因,它们似乎与R中的boxplot函数返回的统计信息不匹配 我觉得这里有些愚蠢
他们的计算方式不同吗?还是我从boxplot中读取了错误的答案?
编辑:
我用过https://www.kaggle.com/uciml/pima-indians-diabetes-database 并运行
mydata=raw$Glucose[raw$Outcome==0]
我想是
#max(min(x), Q1 - (IQR(x)*1.5)) #lower whisker
返回min(x),不应有任何异常值 而min(mydata)为0
编辑3: 分位数的清晰视图
quantile(mydata)
0% 25% 50% 75% 100%
0 93 107 125 197
编辑4: 根据要求添加了向量
c(85L, 89L, 116L, 115L, 110L, 139L, 103L, 126L, 99L, 97L, 145L,
117L, 109L, 88L, 92L, 122L, 103L, 138L, 180L, 133L, 106L, 159L,
146L, 71L, 105L, 103L, 101L, 88L, 150L, 73L, 100L, 146L, 105L,
84L, 44L, 141L, 99L, 109L, 95L, 146L, 139L, 129L, 79L, 0L, 62L,
95L, 112L, 113L, 74L, 83L, 101L, 110L, 106L, 100L, 107L, 80L,
123L, 81L, 142L, 144L, 92L, 71L, 93L, 151L, 125L, 81L, 85L, 126L,
96L, 144L, 83L, 89L, 76L, 78L, 97L, 99L, 111L, 107L, 132L, 120L,
118L, 84L, 96L, 125L, 100L, 93L, 129L, 105L, 128L, 106L, 108L,
154L, 102L, 57L, 106L, 147L, 90L, 136L, 114L, 153L, 99L, 109L,
88L, 151L, 102L, 114L, 100L, 148L, 120L, 110L, 111L, 87L, 79L,
75L, 85L, 143L, 87L, 119L, 0L, 73L, 141L, 111L, 123L, 85L, 105L,
113L, 138L, 108L, 99L, 103L, 111L, 96L, 81L, 147L, 179L, 125L,
119L, 142L, 100L, 87L, 101L, 197L, 117L, 79L, 122L, 74L, 104L,
91L, 91L, 146L, 122L, 165L, 124L, 111L, 106L, 129L, 90L, 86L,
111L, 114L, 193L, 191L, 95L, 142L, 96L, 128L, 102L, 108L, 122L,
71L, 106L, 100L, 104L, 114L, 108L, 129L, 133L, 136L, 155L, 96L,
108L, 78L, 161L, 151L, 126L, 112L, 77L, 150L, 120L, 137L, 80L,
106L, 113L, 112L, 99L, 115L, 129L, 112L, 157L, 179L, 105L, 118L,
87L, 106L, 95L, 165L, 117L, 130L, 95L, 0L, 122L, 95L, 126L, 139L,
116L, 99L, 92L, 137L, 61L, 90L, 90L, 88L, 158L, 103L, 147L, 99L,
101L, 81L, 118L, 84L, 105L, 122L, 98L, 87L, 93L, 107L, 105L,
109L, 90L, 125L, 119L, 100L, 100L, 131L, 116L, 127L, 96L, 82L,
137L, 72L, 123L, 101L, 102L, 112L, 143L, 143L, 97L, 83L, 119L,
94L, 102L, 115L, 94L, 135L, 99L, 89L, 80L, 139L, 90L, 140L, 147L,
97L, 107L, 83L, 117L, 100L, 95L, 120L, 82L, 91L, 119L, 100L,
135L, 86L, 134L, 120L, 71L, 74L, 88L, 115L, 124L, 74L, 97L, 154L,
144L, 137L, 119L, 136L, 114L, 137L, 114L, 126L, 132L, 123L, 85L,
84L, 139L, 173L, 99L, 194L, 83L, 89L, 99L, 80L, 166L, 110L, 81L,
154L, 117L, 84L, 94L, 96L, 75L, 130L, 84L, 120L, 139L, 91L, 91L,
99L, 125L, 76L, 129L, 68L, 124L, 114L, 125L, 87L, 97L, 116L,
117L, 111L, 122L, 107L, 86L, 91L, 77L, 105L, 57L, 127L, 84L,
88L, 131L, 164L, 189L, 116L, 84L, 114L, 88L, 84L, 124L, 97L,
110L, 103L, 85L, 87L, 99L, 91L, 95L, 99L, 92L, 154L, 78L, 130L,
111L, 98L, 143L, 119L, 108L, 133L, 109L, 121L, 100L, 93L, 103L,
73L, 112L, 82L, 123L, 67L, 89L, 109L, 108L, 96L, 124L, 124L,
92L, 152L, 111L, 106L, 105L, 106L, 117L, 68L, 112L, 92L, 183L,
94L, 108L, 90L, 125L, 132L, 128L, 94L, 102L, 111L, 128L, 92L,
104L, 94L, 100L, 102L, 128L, 90L, 103L, 157L, 107L, 91L, 117L,
123L, 120L, 106L, 101L, 120L, 127L, 162L, 112L, 98L, 154L, 165L,
99L, 68L, 123L, 91L, 93L, 101L, 56L, 95L, 136L, 129L, 130L, 107L,
140L, 107L, 121L, 90L, 99L, 127L, 118L, 122L, 129L, 110L, 80L,
127L, 158L, 126L, 134L, 102L, 94L, 108L, 83L, 114L, 117L, 111L,
112L, 116L, 141L, 175L, 92L, 106L, 105L, 95L, 126L, 65L, 99L,
102L, 109L, 153L, 100L, 81L, 121L, 108L, 137L, 106L, 88L, 89L,
101L, 122L, 121L, 93L)
答案 0 :(得分:4)
您的计算几乎是正确的,R使用此方法:
#max(min(x), Q1 - (IQR(x)*1.5)) #lower whisker
#min(max(x), Q3 + (IQR(x)*1.5)) #upper whisker
这就是为什么,它会在max/min
和标准公式之间选择min(x)/max(x)
。
这里有个例子:
my_data <- mtcars$mpg
bp <- boxplot(my_data)
bp$stats
# [1,] 10.40 # lower whisker
# [2,] 15.35
# [3,] 19.20 # == median(my_data)
# [4,] 22.80
# [5,] 33.90 # upper whisker
max(min(my_data,na.rm=T), as.numeric(quantile(my_data, 0.25)) - (IQR(my_data)*1.5))
#[1] 10.4 #lower whisker
min(max(my_data,na.rm=T), as.numeric(quantile(my_data, 0.75)) + (IQR(my_data)*1.5))
#[1] 33.9 # upper whisker
答案 1 :(得分:0)
我认为需要澄清的事情很少。第一件事是,您应始终提供一个可复制的示例来帮助人们帮助您。 离群值定义为位于箱线图晶须之外的数据点(例如:位于上四分位数上方且下四分位数以下的四分位数间距的1.5倍之外)。 弄清楚这项工作是如何在预先指定的随机数生成器状态下模拟某些学生的T数据的正确方法。
set.seed(1)
mydata <- rt(100, df = 3)
boxplot(mydata)
summary(mydata)
然后我们可以根据上面的规则计算四分位数范围以及离群值的上下限
t <- as.vector(summary(mydata))
iqr.range <- t[5]-t[2]
upper_outliers <- t[5]+iqr.range*1.5
lower_outliers <- t[2]-iqr.range*1.5
让我们检查定义为异常值的数据,而箱线图晶须是紧接在上下边界之前/之后的数据点。
mydata[mydata<lower_outliers]
[1] -3.527006 -2.959327 -2.754192
mydata[mydata>upper_outliers]
[1] 3.080302 3.527205