Внесение выбросов в r с помощью sd + mean - PullRequest
0 голосов
/ 02 августа 2020

Я хотел найти выбросы на 3sd от среднего значения. Я мог бы сделать это с помощью следующей функции. Я хочу добавить к функции функцию замены. Я хочу заменить выбросы на среднее + 3sd + (среднее значение участников) / среднее) . В этом случае следует использовать для l oop? Пример для l oop, который я пытаюсь написать, приведен ниже. как можно объединить функцию и для l oop? или есть ли другой способ перебрать каждую строку данных (значение участников) при замене выбросов? В конце концов, я хочу получить новый столбец как результат функции. если все это может быть достигнуто с помощью 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

1 Ответ

0 голосов
/ 02 августа 2020
• 1000
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]
...