2017-08-31 43 views
0

我試圖模擬一羣人的暴露數據,然後對數據有一個布爾條件。所以說這是我的模擬曝光數據:繪製依賴於個體變量和預定義組風險的隨機binom

x <- rlnorm(2000) 

然後,我想爲每個人生成1或0依賴於x的值。我可以簡單地定義`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威廉姆斯回答以下,我寫了一個短的優化器功能:

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

「個體概率依賴於x的值」 - y應該如何與x相關? – arvi1000

+0

是的,這裏的問題的一部分是我不知道如何把這個話。基本上我想要的是P(Y)與x成比例,但我也想控制y == 1的總數。這更清楚嗎? – user2498193

+0

我想你必須更明確地定義'比例'。嚴格地說,我認爲'y < - as.numeric(x arvi1000

回答

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)) 

或者你可以在全局概率編寫一個函數並對其進行優化以獲得「截止」值。

+0

對不起,我很難理解管道操作員,我不完全理解此代碼。但我認爲這是業務線:'ifelse(prob> out $ min.value,1,0))' - 是嗎?再次,這是一個基於價值的切斷,我不希望它不那麼隨機。一夜之間思考 - 我將如何手動執行此操作?我雖然以下。運行我的行'rbinom(n = length(x),1,prob = prob)'。數1。如果整體速度不符合要求,則對每個概率加上或減去一個小值並重新檢查。重複到達到預期的可能性。也許你正確寫作功能和優化。 – user2498193

+0

我用一個優化器函數更新了這個問題,它可能解決了這個問題,但至少讓事情更清晰,我希望。 – user2498193