Использование цикла for для изоляции оценки лесных аномалий - PullRequest
0 голосов
/ 21 марта 2019

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

Вот пример набора данных с тремя компаниями,

set.seed(1234)

id1 <- rep(23, 60)
n1 <- rnorm(n = 60, mean = 100, sd = 5.2)
g1 <- rnorm(n = 60, mean = 200, sd = 8)

id2 <- rep(34, 60)
n2 <- rnorm(n = 60, mean = 500, sd = 110)
g2 <- rnorm(n = 60, mean = 800, sd = 160)

id3 <- rep(3, 60)
n3 <- rnorm(n = 60, mean = 50, sd = 11)
g3 <- rnorm(n = 60, mean = 80, sd = 16)

id <- c(id1, id2, id3)
n <- c(n1, n2, n3)
g <- c(g1, g2, g3)

df <- data.frame(id, n, g)
rm(list = ls() [!ls() %in% "df"])

Первая переменная - это компания id. Каждая компания имеет 60 наблюдений. Код, который я хочу запустить в каждой компании, выглядит следующим образом.

library(isofor)
mod <- iForest(X = df, 50, 10)
anomalyscore <- predict(mod, df)
df <- data.frame(df, anomalyscore)

Однако, чтобы запускать команды для каждой компании отдельно, мне понадобится такой цикл,

n <- 3
for (i in 1:n {
  mod <- iForest(X = df, 50, 10)
  anomalyscore <- predict(mod, df)
  df <- data.frame(df, anomalyscore)
}

Вопрос 1 Какую ошибку / ошибки я сделал в вышеуказанном цикле? То, что он делает, создает три оценки аномалии вместо одного. Мне нужен один столбец оценок аномалий, рассчитанных отдельно для каждой компании

Вопрос 2 Давайте предположим, что я точно не знаю количество наблюдений для каждой компании, тогда как это настроить в цикле?

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 21 марта 2019

Примерно так должно работать:

df$anomalyscore <- NA
library(dplyr)
for (i in unique(df$id)) {
    mod <- iForest(X = filter(df, id == i), 50, 10)
    anomalyscore <- predict(mod, filter(df, id == i))
    df$anomalyscore[df$id == i] <- anomalyscore
    rm(anomalyscore)
}

Объяснение:

  • Добавить поле anomalyscore со значениями NA
  • Итерировать по id и генерируйте оценки только для этого id
  • Обновите anomalyscore для этого идентификатора

Хотя это должно ответить на ваш вопрос, вы должны посмотреть на purrrфункции и dplyr для запуска функции в каждой группе, используя mutate и group_by

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...