从随机猜测二进制分类模型模拟

问题描述

我需要模拟来自随机猜测二进制分类器的数据,这样

$ p(成功)= 0.55 $和$ p(失败)= 1-0.55 $。

因此,我对伯努利分布中的数据进行了如下模拟,并将结果与​​实际响应数据进行了比较。

concatTuples

我正确地做到了吗?任何指导都将真正有帮助。

解决方法

对我来说合理。不过,您不需要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,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,prob=.55)
  pr1 <- sum(y_pred) / length(y_pred)
  if (pr1 <= .55 + tol & 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!

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...