【问题标题】:Quantitative risk assessment model定量风险评估模型
【发布时间】:2013-01-08 06:53:50
【问题描述】:
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。因此,例如,如果有一个 1 并且它的 raw 那么新的 densf 应该等于 1 否则 0。类似地,如果有一个 1 并且它的熟的那么新的 densft 应该等于 1(基于二项式 rv 与在上述情况下 alpha 为 0.02,否则为 0。

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

【问题讨论】:

    标签: r statistics simulation


    【解决方案1】:

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

    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)
    

    【讨论】:

      【解决方案2】:

      学习 R 编程时最重要的事情之一是考虑向量运算而不是循环。您在两个向量中得到NAs(与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)
      

      注意事项:

      • ifelse 的使用,它是if 的矢量化形式。
      • &amp; 的使用,它是&amp;&amp; 的矢量化形式。
      • 没有循环! R中的循环很慢。考虑向量需要一些调整,但几乎总是更好。

      当我运行这个时,我在densf 中得到了 12 个,在 densft 中得到了 3 个,这与我的预期差不多。如果这不是所期望的,那么您需要更好地解释您在这里尝试做什么以及为什么您期望有所不同。

      【讨论】:

      • 非常感谢。如果我可以问。我实际上必须为从 0.2 到 0.9 的一串值生成 densft。你有关于我应该如何去做的提示吗?还是我每次都必须将 0.2 更改为 0.25、0.3 等...?
      • R 中的循环通常并不慢。在它们中完成的操作可能会很慢,尤其是如果您犯了增长对象或子集 data.frames 的错误。当然,矢量化解决方案仍然更好。
      • @user2007598 您可以编写一个计算 densft 的函数,然后多次调用该函数。 densft 中条目的分布很容易通过分析找到 - 用笔和纸做这可能比通过模拟更容易。
      猜你喜欢
      • 2020-10-15
      • 2011-03-14
      • 2018-04-22
      • 1970-01-01
      • 2017-03-24
      • 1970-01-01
      • 1970-01-01
      • 2020-03-06
      • 2017-04-24
      相关资源
      最近更新 更多