使用“boxplot.stats”删除 R 中的数据帧异常值
Removing dataframe outliers in R with `boxplot.stats`
我是 R 的新手,所以请多多包涵。
我正在使用 Ames 数据集(数据集的完整描述 here; link to dataset download here)。
我正在尝试创建一个子集数据框,以便 运行 进行线性回归分析,并且我正在尝试使用 boxplot.stats
函数删除异常值。我使用以下代码创建了一个包含我的示例的框架:
regressionFrame <- data.frame(subset(ames_housing_data[,c('SalePrice','GrLivArea','LotArea')] , BldgType == '1Fam'))
我的下一个 objective 是删除异常值,所以我尝试使用 which()
函数进行子集化:
regressionFrame <- regressionFrame[which(regressionFrame$GrLivArea != boxplot.stats(regressionFrame$GrLivArea)$out),]
不幸的是,这产生了
longer object length is not a multiple of shorter object length
错误。有谁知道更好的方法来解决这个问题,最好是使用 which()
子集函数?我假设它会包含某种形式的 lapply()
,但对于我的生活我无法弄清楚如何。 (我想我以后总是可以学习更高级的方法,但这是我现在要学习的方法,因为我已经了解它了。)
与 boxplot.stats
一起使用效果不错。
如果 boxplot.stats
returns 你在 $out
中有多个异常值,则无法使用 !=
进行安全测试。这里的一个类比是1:5 != 1:3
。您可能想尝试 !(1:5 %in% 1:3)
.
regressionFrame <- subset(regressionFrame,
subset = !(GrLivArea %in% boxplot.stats(GrLivArea)$out))
我所说的安全的意思是,1:5 != 1:3
给出了一个错误的结果并带有警告,但是 1:6 != 1:3
给出了一个没有警告的错误结果。该警告与 回收规则 有关。在后一种情况下,1:3
可以被回收到和1:6
一样的长度(即1:6
的长度是1:3
长度的倍数),所以您将使用 1:6 != c(1:3, 1:3)
进行测试。
一个简单的例子。
x <- c(1:10/10, 101, 102, 103) ## has three outliers: 101, 102 and 103
out <- boxplot.stats(x)$out ## `boxplot.stats` has picked them out
x[x != out] ## this gives a warning and wrong result
x[!(x %in% out)] ## this removes them from x
我是 R 的新手,所以请多多包涵。
我正在使用 Ames 数据集(数据集的完整描述 here; link to dataset download here)。
我正在尝试创建一个子集数据框,以便 运行 进行线性回归分析,并且我正在尝试使用 boxplot.stats
函数删除异常值。我使用以下代码创建了一个包含我的示例的框架:
regressionFrame <- data.frame(subset(ames_housing_data[,c('SalePrice','GrLivArea','LotArea')] , BldgType == '1Fam'))
我的下一个 objective 是删除异常值,所以我尝试使用 which()
函数进行子集化:
regressionFrame <- regressionFrame[which(regressionFrame$GrLivArea != boxplot.stats(regressionFrame$GrLivArea)$out),]
不幸的是,这产生了
longer object length is not a multiple of shorter object length
错误。有谁知道更好的方法来解决这个问题,最好是使用 which()
子集函数?我假设它会包含某种形式的 lapply()
,但对于我的生活我无法弄清楚如何。 (我想我以后总是可以学习更高级的方法,但这是我现在要学习的方法,因为我已经了解它了。)
与 boxplot.stats
一起使用效果不错。
如果 boxplot.stats
returns 你在 $out
中有多个异常值,则无法使用 !=
进行安全测试。这里的一个类比是1:5 != 1:3
。您可能想尝试 !(1:5 %in% 1:3)
.
regressionFrame <- subset(regressionFrame,
subset = !(GrLivArea %in% boxplot.stats(GrLivArea)$out))
我所说的安全的意思是,1:5 != 1:3
给出了一个错误的结果并带有警告,但是 1:6 != 1:3
给出了一个没有警告的错误结果。该警告与 回收规则 有关。在后一种情况下,1:3
可以被回收到和1:6
一样的长度(即1:6
的长度是1:3
长度的倍数),所以您将使用 1:6 != c(1:3, 1:3)
进行测试。
一个简单的例子。
x <- c(1:10/10, 101, 102, 103) ## has three outliers: 101, 102 and 103
out <- boxplot.stats(x)$out ## `boxplot.stats` has picked them out
x[x != out] ## this gives a warning and wrong result
x[!(x %in% out)] ## this removes them from x