根据单个变量和预定义的组风险绘制随机二进制文件

时间:2017-08-31 22:03:26

标签: r probability

我正在尝试在一组人中模拟曝光数据,然后在数据上设置布尔条件。所以说这是我的模拟曝光数据:

x <- rlnorm(2000)

然后我想为依赖于x值的每个人生成1或0。我可以简单地将'max(x)'定义为P == 1,将较小的值定义为其比例:

prob <- x / max(x)
y <- rbinom( n=length(x), 1, prob=prob)
> table(y)
y
   0    1 
1900  100

然而,这不是我想要的。我还希望能够为该群体设定总体人口风险,比如30%(因此“风险= 0.3”),这样个人风险取决于x,但总体风险= 0.3。最后,我希望30%的人口有y == 1,但个人概率取决于x的值。我不知道如何实现这一目标 - 任何帮助表示赞赏。

更新 从@B Williams回答下面的提示,我写了一个简短的优化函数:

df1 <- data.frame(x = rlnorm(2000))
df1$prob <- df1$x / max(df1$x)
risk = 0.3

optimize_prob <- function(prob, risk, delta = 0.01, tol = 0.02, max_iter = 400, mult=1){

    prob1 <- prob

    for( i in 1: max_iter){    
        y <- rbinom( n=length(prob1), 1, prob=prob1)
        meas_risk <- sum(y==1) / length(y)
        if( abs(risk - meas_risk) > tol) {
            sign <- as.numeric((risk - meas_risk) >= 0)
            prob1 <- prob1 + (sign * delta) + (prob1 *delta * mult)
            # prob1's must lie between 0 & 1
            prob1 <- ifelse(prob1 > 1, 1, prob1)
            prob1 <- ifelse(prob1 < 0, 0, prob1)
        } else {
            break
        }
    }
    msg <- paste0("Iterations: ", i)
    print(msg)
    out <- cbind(prob1, y)
    return(out)
}

df1 <- data.frame(df1, optimize_prob( df1$prob, risk, mult=3))
df1$y <- as.factor(df1$y)
table(df1$y)

这或多或少达到了我想要的结果。但是,如果有人知道更简洁的方式,我会非常感谢建议。对上述内容的任何效率改进都表示赞赏,因为如果一切按计划进行,我将会运行它。

1 个答案:

答案 0 :(得分:0)

我可能无法正确理解你想要做什么,但这是我的猜测。

library(dplyr)
df <- data.frame(x = rlnorm(2000))

拉出前600(2000年的30%)值并获得最小值

df %>% 
    mutate(prob = x/max(x)) %>%  
    top_n(600) %>% 
    summarise(min.value = min(prob)) -> out

根据最小值设置全局概率

df %>% 
    mutate(prob = x/max(x),
             global = ifelse(prob > out$min.value, 1, 0)) %>% 
    summarise(one = sum(global))

或者你可以编写一个函数并对其进行优化以获得&#34; cutoff&#34;值。