我正在尝试在一组人中模拟曝光数据,然后在数据上设置布尔条件。所以说这是我的模拟曝光数据:
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)
这或多或少达到了我想要的结果。但是,如果有人知道更简洁的方式,我会非常感谢建议。对上述内容的任何效率改进都表示赞赏,因为如果一切按计划进行,我将会运行它。
答案 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;值。