Имитировать на основе модели двоичной классификации случайного предположения

#r #classification #simulation

#r #классификация #Симуляция

Вопрос:

Мне нужно было смоделировать данные из двоичного классификатора случайных догадок таким образом, чтобы

$ p (успех) = 0,55 $ и $ p (неудача) = 1-0,55 $.

Итак, я смоделировал данные из распределения Бернулли следующим образом и сравнил результаты с фактическими данными ответа.

 set.seed(123)
#predicted response
y_pred=replicate(50,rbinom(1,1,prob = 0.55))

#actual response
y=sample(rep(0:1,each=25))

table(y,y_pred)
 

  y_pred
y    0  1
  0 13 12
  1 10 15
  

Правильно ли я это сделал? Любое руководство было бы действительно полезным.

Ответ №1:

Выглядит разумно для меня. Однако вам не нужно replicate . И лично я бы установил глобальный n :

 set.seed(123)
## predicted response
n <- 50
y_pred <- rbinom(n, 1, prob=.55)
## calculate actual probability of predicted response
sum(y_pred) / length(y_pred)
# [1] 0.54

## actual response
y <- sample(rep(0:1, each=n/2))
## calculate actual probability of actual response
sum(y) / length(y)
# [1] 0.5

table(y, y_pred)
#    y_pred
# y    0  1
#   0 13 12
#   1 10 15
  

Однако фактическая вероятность вашего прогнозируемого ответа при таких малых n может иметь большие случайные колебания (т. Е. Зависит от начального значения), особенно при малых n . Давайте на минуту поместим код в функцию, чтобы показать это.

 n <- 50

sfun <- function() {
  y_pred <- rbinom(50, 1, prob=.55)
  sum(y_pred) / length(y_pred)
}

set.seed(383159)
sfun()
# [1] 0.62  ## 13% off!
set.seed(82809)
sfun()
# [1] 0.44  ## 20% off!
  

Что вы могли бы сделать, так это использовать repeat цикл, который прерывается, если результат находится в пределах заданного tol интервала. (Обратите внимание, что это будет выполняться вечно, когда tol установлено слишком маленькое значение!)

 tol <- .01
set.seed(123)
n <- 50
repeat({
  y_pred <- rbinom(n, 1, prob=.55)
  pr1 <- sum(y_pred) / length(y_pred)
  if (pr1 <= .55   tol amp; pr1 >= .55 - tol)
    break
  })
y_pred
# [1] 1 0 1 0 0 1 1 0 0 1 0 1 0 0 1 0 1 1 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0
# [35] 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0
sum(y_pred) / length(y_pred)
# [1] 0.54  ## ok!