定量风险评估模型

时间:2013-01-24 13:36:47

标签: r statistics simulation

N=1000
alpha=0.1 

zerosandones = rbinom(N, 1,alpha)

vector1=sample(c("raw","cooked"),1000,T,prob=c(0.12,.88))
vector1

densf=NULL
densft=NULL

for (i in (1:N))
{   
  if (zerosandones[i]==1 && vector1[i]=="raw") {densf[i] = 1} 
  else {if(zerosandones[i]==1 && vector1[i]=="cooked") {densft[i] <- rbinom(1, 1,alpha*0.2)}
  else {if (zerosandones[i]==0 && vector1[i]=="raw") {densf[i]=0} 
  else {if (zerosandones[i]==0 && vector1[i]=="cooked") {densft[i]=0}}}}}
densft
densf
嘿伙计们,

我是R的新手,并建立了定量风险评估模型。简单地说,这里的想法是我们生成一个1000 0和1的样本,每个0,1都有一个原始/煮熟的关联。所有0都被删除,我们进一步分析1。因此,例如,如果有一个和它的原始然后新的densf应该等于1,否则为0.同样,如果有一个并且它已经煮熟,那么新的densft应该等于1(基于二项式rv模拟一个在上述情况下,α为0.02,否则为0.

那就是说,我需要一些帮助,因为“densf”和“densft”会产生一堆NaN值,将0和1放在错误的位置。请帮忙!

2 个答案:

答案 0 :(得分:7)

这是一个有效的矢量化解决方案:

N=1000
alpha=0.1 
zerosandones = rbinom(N, 1,alpha)
vector1=sample(c("raw","cooked"),1000,T,prob=c(0.12,.88))

# new code:
densf <- as.integer(zerosandones & vector1 == "raw")
densft <- (zerosandones & vector1 == "cooked") * rbinom(N, 1, alpha*0.2)

答案 1 :(得分:3)

在R中学习编程时最重要的事情之一就是考虑向量运算而不是循环。您在两个向量中得到NA s(与R中的NaN不同),因为您没有填充所有位置:您只填充densf中的位置您拥有"raw"以及densft"cooked"所在地的位置。你想让R用其他空间填充什么? NA是默认值,但如果需要,您可以使用其他内容(例如零)填充它们。这就是我在下面所做的。

# your code
N=1000
alpha=0.1 

zerosandones = rbinom(N, 1,alpha)

vector1=sample(c("raw","cooked"),1000,T,prob=c(0.12,.88))

# my code
densf <- ifelse(zerosandones == 1 & vector1 == "raw", 1, 0)
densft <- ifelse(zerosandones == 0 & vector1 == "raw", rbinom(N, 1,alpha*0.2), 0)

注意事项:

  • 使用ifelseif
  • 的矢量化形式
  • 使用&&&
  • 的矢量化形式
  • 没有循环! R中的循环很慢。从向量的角度思考需要一些调整,但几乎总是更好。

当我跑步时,densf中有12个,densft中有3个,这与我的预期相符。如果这不是期望的那样,那么你需要更好地解释你在这里尝试做什么,以及为什么你期望不同的东西。