【问题标题】:How to remove outliers from a subset in R?如何从R中的子集中删除异常值?
【发布时间】:2018-05-09 11:26:48
【问题描述】:

我对 R 非常陌生,正在尝试从子集中删除异常值以改进 GLM。我使用的代码是:

data$sel <- ifelse(data$chol==8.3 & data$whr==1.14 ,(0), (1))
data
dim(data)
data2 <- subset(data, !(chol==8.3 & whr==1.14))
dim(data2)

我这样做了,但是,当我尝试使用新数据绘制图表时,该点仍然显示。我用来绘制新图的代码是:

dataF2 <- subset(data2, sex=="F")
dataF2
dataM2 <- subset(data2, sex=="M")
dataM2

plot(chol ~ whr, data=data2, type="n", ylab="Cholesterol (mM/L)", xlab="Waist-hip Ratio") 

#### add each group of points:
points(dataF2$chol ~ dataF2$whr, pch=1, col="red")
points(dataM2$chol ~ dataM2$whr, pch=2, col="blue")

Females2 <- lm(chol ~ whr, data=dataF2)
summary(Females)
abline(-8.053, 14.801, col="red")
Males2 <- lm(chol ~ whr, data=dataM2)
summary(Males2)
abline(-3.5896, 8.5617, col="blue")

我不确定我做错了什么,或者我是否遗漏了一些重要步骤。我要做的就是删除一个或两个异常值,以便我可以改进 GLM,然后生成一个没有异常值的图形。

数据

'data.frame':   100 obs. of  7 variables:
 $ age  : int  42 41 40 43 61 44 39 70 47 55 ...
 $ sex  : Factor w/ 2 levels "F","M": 1 1 1 1 1 1 2 1 1 1 ...
 $ bmi  : num  28.5 26.2 25.2 29.3 34.6 26.7 25.5 33.2 28.8 31.4 ...
 $ whr  : num  0.83 0.82 0.84 0.82 0.89 0.81 0.93 0.97 0.86 0.88 ...
 $ sysbp: int  132 135 141 142 167 145 137 182 150 160 ...
 $ chol : num  4.2 3.3 4.3 4.1 5.5 4.4 3.9 6.7 4.7 5.2 ...
 $ smoke: Factor w/ 2 levels "N","Y": 1 2 2 2 1 2 1 2 2 2 ...

数据2:

'data.frame':   99 obs. of  8 variables:
 $ age  : int  42 41 40 43 61 44 39 70 47 55 ...
 $ sex  : Factor w/ 2 levels "F","M": 1 1 1 1 1 1 2 1 1 1 ...
 $ bmi  : num  28.5 26.2 25.2 29.3 34.6 26.7 25.5 33.2 28.8 31.4 ...
 $ whr  : num  0.83 0.82 0.84 0.82 0.89 0.81 0.93 0.97 0.86 0.88 ...
 $ sysbp: int  132 135 141 142 167 145 137 182 150 160 ...
 $ chol : num  4.2 3.3 4.3 4.1 5.5 4.4 3.9 6.7 4.7 5.2 ...
 $ smoke: Factor w/ 2 levels "N","Y": 1 2 2 2 1 2 1 2 2 2 ...
 $ sel  : num  1 1 1 1 1 1 1 1 1 1 ...

【问题讨论】:

  • 您的代码不是reproducible。请提供您的数据或一些最小形式的数据。
  • 您的代码仍然无法重现。塞德里克的回答有帮助吗?

标签: r subset outliers


【解决方案1】:

要对数据进行子集化,您可以将 TRUE FALSE 向量传递给行。

您的数据框是 data2[line,columns]

data2 <- data2[data2$chol!=8.3 & data2$whr!=1.14,]

阅读this r blogger example 以更好地了解如何从数据框中删除一些行。

你也可以使用

data2 <- subset(data, (chol!=8.3 & whr!=1.14))

data2 <- subset(data, !(chol==8.3 | whr==1.14))

我的猜测是你没有 chol 和 whr 都具有这些值的行, 你想删除两个不同的行。

最后的建议,检查你传递的内容,使用第一个公式可以让你检查那段代码,

data2$chol!=8.3 & data2$whr!=1.14

并检查是否返回您期望的 TRUE FALSE 向量

【讨论】:

    猜你喜欢
    • 2011-06-14
    • 2019-04-11
    • 2012-08-11
    • 1970-01-01
    • 2017-04-24
    • 2011-02-06
    • 2021-12-26
    • 2020-11-17
    相关资源
    最近更新 更多