【问题标题】:Calculate efficiently the minimum over each group and sub-group有效计算每个组和子组的最小值
【发布时间】:2011-05-21 07:52:08
【问题描述】:

假设我们从某个人群中抽取了一个随机样本y1, y2, ...,yn,所以double y[]int n 是已知的。我们的人口中有一些群体,但我们并不确切知道哪个观察被分配给特定群体。所以对于每个yi,我们引入了一个分配变量zi,它告诉我们yi是从哪个组中抽取的。现在我们假设有int k 组,所以zi e {0, .., k-1} for all i。现在要对组进行推断,我需要多次迭代我的算法,比如 50,000 或 100,000。在每次迭代中,我们将概率性地将每个观察分配给某个组,因此我的分配数组int z[] 将会改变。在这种情况下,计算每组中的观察次数和最小值非常容易;

int nj[k], yj_min[k];

/* initializing the variables at each iteration */
for(j=0; j<k; j++){
    nj[j]=0;
    yj_min[j]=y[n]; /* y[] are ordered so y[n] is the maximum*/
} 

for(i=0; i<n; i++){
    nj[z[i]] = nj[z[i]] + 1;
    if(yj_min[z[i]]) < y[z[i]]){
        yj_min[z[i]] = y[z[i]];  
    }
}

但是,如果我们为每个观测值 yi 引入一个进一步的分配变量 di,它将指示对 yi 进行抽样的子组(以及概率抽样)。有 int m 个子组,所以 di e {0, .., m-1}。然后(zi=j, di=s) 表示观察yi 已从组j 和子组s 中抽取。

我如何才能有效地计算,因为我必须在每次迭代中都这样做,最小的 yjs_min 超过 {i:zi=j, di=s}?即yi 的最小值,使得zi=jdi=sj=0, ..k-1s=0,..,m-1

做类似的事情会很棒

for(i=0; i<n; i++){
    njs[z[i]][d[i]] = njs[z[i]][d[i]] + 1;
    if(yjs_min[z[i]][d[i]]) < y[z[i]][d[i]]){
        yjs_min[z[i]][d[i]] = y[z[i]][d[i]];  
    }
}

但显然这是不可能的!!!那么请有什么想法?

干杯, 卡洛斯

【问题讨论】:

  • 您能否提供一些示例数据和输出,以便我们更好地了解您正在尝试做什么?谢谢。
  • 据我了解,有nykz,那你怎么用y[z[i]]呢?

标签: c


【解决方案1】:

您似乎正在尝试执行诸如 Fisher 精确检验或置换检验之类的操作。如果是这样,您可以尝试使用 R 之类的统计软件包,它旨在完成此类工作,并且可能已经内置了最有效的算法。

除此之外,据我了解,您将样本分层为 n 个子组 (y),然后将这些子组中的每个子组分为 k 个子子组。您想找到每个子组的最小元素。

一个相当有效的解决方案是:创建 n*k 个唯一标识符,以及一个指示它们中的每一个对应于哪个子子组的映射。然后,将这些数字(使用相同的分布)随机分配给您的样本观察(就像您以前一样)。使用有效的就地排序(如使用正确选择的枢轴进行快速排序)按标识符对样本进行排序,以便将具有相同标识符的所有元素存储在连续的内存块中。这需要对数线性时间,因此应该非常快。

然后你只需要按顺序遍历数组,找到每个唯一标识符的最小元素。这应该需要线性时间和 n*k 额外空间。

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 2013-06-08
    • 2021-09-25
    • 2022-07-05
    • 2021-06-03
    • 2018-08-09
    • 2021-05-23
    • 2015-08-31
    • 1970-01-01
    • 2021-12-06
    相关资源
    最近更新 更多