3

我正在构建代码来运行和管理站点的采样事件模拟,这些站点可能位于三个站点群组之一中。我使用rep()以下代码分配群组标识符(1、2 或 3):

cohort <- rep(1:n.cohorts, n.sites) 

我已将关键行放在首位,尽管要重现我的问题,您需要运行以下行,它们会在群组之间分配总站点数,以便向rep()通话演示。

n.cohorts <- 3
s <- 10 # total available sites in this example

# different proportions of the total can be allocated to each cohort, for example 
prop.control <- 0.4 ; prop.int <- 0.4 ; prop.ref <- 1-(prop.int+prop.control)
n.control <- prop.control * s; n.int <- prop.int * s; n.ref <- prop.ref * s 
n.sites <- c(n.control, n.int, n.ref)  

现在,n.sites它自己返回

[1] 4 4 2

所以当我cohort <- rep(1:n.cohorts, n.sites)再次运行我的电话时,我希望cohort得到一个包含 10 个项目的列表,如下所示[1] 1 1 1 1 2 2 2 2 3 3:然而,我得到的只有 9 个:

> cohort
[1] 1 1 1 1 2 2 2 2 3    

如果我n.sites像这样运行直接定义的相同代码:n.sites <- c(4, 4, 2),我会得到我期望的 10 个项目。我已经重做了几次以说服自己在这两种情况n.sites下本身会产生相同的结果。

谁能解释为什么会这样?提前谢谢了。

大卫

4

1 回答 1

2

我认为这是 R 中的算术不准确问题之一。问题就在这里:

prop.ref <- 1-prop.int-prop.control
prop.ref*10
#[1] 2
floor(prop.ref*10)
#[1] 1

所以 r 认为它prop.int+prop.control比 0.8 略大

您可以通过以下方式修复它

cohort <- rep(1:n.cohorts, ceiling(n.sites)) 

但你是对的,这似乎是一个严重的错误编辑 - 抱歉意味着看起来像一个严重的错误

于 2014-01-28T07:07:06.740 回答