使用 'boxplot.stats' 删除 R 中的数据帧异常值



我在R比较新,所以请耐心等待。

我正在使用Ames数据集(数据集的完整描述在这里;链接到数据集下载在这里(。

我正在尝试创建一个子集数据框,该数据框将允许我运行线性回归分析,并且我正在尝试使用boxplot.stats函数删除异常值。我使用以下代码创建了一个将包含我的示例的框架:

regressionFrame <- data.frame(subset(ames_housing_data[,c('SalePrice','GrLivArea','LotArea')] , BldgType == '1Fam'))

我的下一个目标是删除异常值,所以我尝试使用which()函数进行子集化:

regressionFrame <- regressionFrame[which(regressionFrame$GrLivArea != boxplot.stats(regressionFrame$GrLivArea)$out),]

不幸的是,这产生了

较长的对象长度不是较短对象长度的倍数

错误。有谁知道更好的方法来解决这个问题,最好使用which()子集函数?我假设它会包括某种形式的lapply(),但对于我的生活,我不知道如何。(我想我以后总是可以学习更花哨的方法,但这是我现在要追求的方法,因为我已经理解了它。

很好地使用boxplot.stats

如果boxplot.stats$out中返回多个异常值,则无法使用!=安全地进行测试。这里的类比是1:5 != 1:3.您可能想尝试!(1:5 %in% 1:3).

regressionFrame <- subset(regressionFrame,
subset = !(GrLivArea %in% boxplot.stats(GrLivArea)$out))

我所说的 SAFELY 是指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

最新更新