【问题标题】:Imputing outliers in r with sd+mean用 sd+mean 计算 r 中的异常值
【发布时间】:2020-11-22 10:46:47
【问题描述】:

我想找出离均值 3sd 的异常值。我可以使用以下功能做到这一点。我想在函数中添加一个替换函数。我想用 mean+3sd+(participants value-mean)/mean) 替换异常值。在这种情况下,我应该使用 for 循环吗?下面给出了我正在尝试编写的循环示例。函数和for循环如何合并?或者在替换异常值时是否有任何其他方法可以迭代每一行数据(参与者值)? 最后,我希望有一个新列作为函数的结果。如果所有这些都可以通过 dplyr mutate 或其他功能实现,我愿意接受任何解决方案。

findingoutlier<- function (data, cutoff=3, na.rm=TRUE){
  sd <- sd(data, na.rm=TRUE)
  mean <- mean(data, na.rm=TRUE
  outliers <- (data[data < mean - cutoff * sd | data > mean + cutoff * sd])
  return (outliers)
  }

for (i in data) {
     x<- mean+3sd+(i-mean)/mean
     replace(data, outliers, x)
   }

# example data 
bmi <- c(32.8999, 31.7826, 28.5573, 20.6350, 21.6311, NA, 29.6174, 52.7027, 58.5968, 30.1867, 28.7927, 26.4697, 42.0294, 27.1309, 56.3672, 62.6474, 34.1692, 31.5120, 29.8553, 34.4443, 25.4049, 25.7287, 71.3209, 23.5615, 19.9359,21.7438, 51.9286, 22.1875, NA, 24.4389, 28.1571, 23.7093, 47.5551, 27.7767, 30.3237, NA, 20.7838, 34.1878, 25.1559, 25.8645, 24.9673, 27.5374, 28.5467, 25.0402, 22.1056, 28.0026, 26.7901, 21.5110,NA, 50.7599, NA, 32.6979, 26.5295, 25.5246, 23.9657, 20.1323, 28.0452)
eid <- c(1:57)
df <- cbind(eid, bmi)
df

【问题讨论】:

  • 请使用dput 添加数据并显示相同的预期输出。请阅读有关how to ask a good question 的信息以及如何提供reproducible example。是否要分别替换每一行的异常值?
  • @Ronak Shah 谢谢。我会阅读信息。我想用以下等式的结果替换异常值:数据的平均值+ 3 * sd +(参与者的值(行的值)-数据的平均值)/数据的平均值。为了实现这一点,我需要一个函数来表示每行数据的负均值并将原始值替换为结果。

标签: r function for-loop outliers


【解决方案1】:

诀窍在于,您不仅可以将索引子集用作右侧值(要读取的内容),还可以用作左侧值(要写入的内容),如下所示:

m <- mean(data, na.rm=TRUE)
s <- sd(data, na.rm=TRUE)
# get the *indices* of the outliers
indices <- (abs(m - data) > 3*s) | is.na(data)
# compute the replacement for *every* value
replacement <- (data + m) / m + 3*s
# replace *only* the outliers
data[indices] <- replacement[indices]

【讨论】:

  • 非常感谢,但是当我运行它时,我收到以下错误:数据[indices] 我怎么说 NA 必须保留
  • 我已经编辑了我的答案,包括对 NA (is.na) 的测试。由于计算或替换为 NA 输入产生 NA,这将保留 NA。由于您是新的贡献者,这里有一个提示:如果一个答案确实回答了问题,您应该接受该答案,以便将其从未决问题列表中删除。
  • 我已经运行了以下代码test_1&lt;- function(data) { m &lt;- mean(data, na.rm=TRUE) s &lt;- sd(data, na.rm=TRUE) indices &lt;- (abs(m - data) &gt; 3*s) | is.na(data) replacement &lt;- (data + m) / m + m + 3*s data[indices] &lt;- replacement [indices] } 但是我收到一个错误,说替换数据必须与现有数据兼容。 x 现有数据有 502506 行。 x 分配的数据有 9097 行。 i 只有大小为 1 的向量被回收。
  • 刚刚用data &lt;- test_1(df[,2])问题中的测试数据测试了函数,我没有收到错误。此外,data != df[,2] 报告实际上替换了一个值。
猜你喜欢
  • 2012-10-03
  • 1970-01-01
  • 1970-01-01
  • 2011-07-28
  • 1970-01-01
  • 2016-07-11
  • 1970-01-01
  • 2020-07-21
  • 2017-06-28
相关资源
最近更新 更多