Внести выбросы с SD с помощью функции - PullRequest
0 голосов
/ 03 августа 2020

Я пытаюсь найти выбросы и приписать им замену. У меня есть две проблемы, которые я хочу исправить:

  1. Функция ниже находит выбросы, но я хочу найти и вменять выбросы с заменой, описанной ниже.
  2. Функция возвращает вектор, короче колонки. Я хочу иметь новый столбец с именем bmi_imputed, который имеет выбросы, вмененные заменой.
# bmi <- c(32.8999, 31.7826, 28.5573, 20.6350, 21.6311, NA, 69.6174, 52.7027, -8.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 <- as.data.frame (cbind(eid, bmi))

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])
  outliers <- outliers[!is.na(outliers)]
}

replacement <- mean+sd*3 + ((data-mean)/mean)

1 Ответ

0 голосов
/ 03 августа 2020

Вы можете попробовать:

df <- data.frame(eid, bmi)

findingoutlier<- function (data, cutoff=3, na.rm=TRUE){
   sd <- sd(data, na.rm=TRUE)
   mean <- mean(data, na.rm=TRUE)
   inds <- ((data < mean - cutoff * sd) | 
            (data >mean + cutoff * sd)) & !is.na(data)

   data[inds] <-  mean+sd*3 + ((data[inds]-mean)/mean)
   data
}

, а затем изменить значения выбросов на:

df$bmi <- findingoutlier(df$bmi)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...