【发布时间】:2020-05-14 12:58:40
【问题描述】:
我有鸟类的数据,我在这些数据中比较了多年来和彼此之间的翅膀长度和重量。我注意到从振铃站收到的一些数据包含不准确的输入。例如,对于某个物种,机翼长度在 40-60 毫米之间,但是在 578 毫米处有一个异常值,这一定是输入错误的结果。是否可以从数据集中排除这些极端异常值?
【问题讨论】:
-
请提供您的数据集或虚拟示例。你可以使用
dput(your_data_frame)
我有鸟类的数据,我在这些数据中比较了多年来和彼此之间的翅膀长度和重量。我注意到从振铃站收到的一些数据包含不准确的输入。例如,对于某个物种,机翼长度在 40-60 毫米之间,但是在 578 毫米处有一个异常值,这一定是输入错误的结果。是否可以从数据集中排除这些极端异常值?
【问题讨论】:
dput(your_data_frame)
你有两个选择:
max_believable_value=100
mydata = mydata[ mydata>max_believable_value ]
这通常不是很令人满意,首先因为它会“无形地”删除它们,因此您不会注意到是否系统地发生了更严重的事情,其次因为它会改变您的数据形式。如果您有 100 个样本,并且特定样本的一个观察值被认为是“异常值”,但其他的都可以,那么您可能不想完全删除整个样本。
mydata[ mydata>max_believable_value ] = NA
这正是“NA”值的含义(“不可用”值),并且大多数 R 函数都包含允许您指定如何处理 NA 值(包括删除它们!)的选项。 这种方法清楚地表明您有多少“异常值”(或其他可疑值),并且即使一个或多个观察结果看起来无效,您也可以将样本保留在数据中。
【讨论】:
您可以使用类似的方式从数据框中删除这些值
df <- df[-which(df$wing_length > 500), ]
一个例子:
> df <- data.frame(a=1:10, b=11:20)
> df
a b
1 1 11
2 2 12
...
9 9 19
10 10 20
> df <- df[ - which(df$a>5), ]
> df
a b
1 1 11
2 2 12
3 3 13
4 4 14
5 5 15
【讨论】:
which语句之外。
使用dplyr,您可以使用过滤数据
library(dplyr)
df <- filter(df, wing_length < 500)
有时,真正的交易是选择使用什么数字作为排除异常值的限制。有些人使用 3 倍数据的标准差:
library(dplyr)
df <- filter(df, wing_length < (sd(df$wave_length)*3))
【讨论】: