【问题标题】:Conditional Probability Table in SASSAS中的条件概率表
【发布时间】:2017-01-22 19:49:11
【问题描述】:

我在 SAS 工作,试图创建一个条件概率表。

表格的当前结构是:5 列 x 10 行 --> 每个单元格中的值都是二进制的。 Current Data Table

col1    col2    col3    col4    col5
1   0   1   0   0
0   0   0   1   1
0   0   0   0   0
1   0   0   0   0
1   0   0   0   1
0   1   0   0   0
0   1   0   1   0
1   1   1   1   0
1   0   1   0   1
1   0   1   0   0

我想创建一个表格,其中包含每列与其他每列的条件概率。 Ideal Output

--- col1    col2    col3    col4    col5
col1    1.0 0.3 1.0 0.3 0.7
col2    0.2 1.0 0.3 0.7 0.0
col3    0.7 0.3 1.0 0.3 0.3
col4    0.2 0.7 0.3 1.0 0.3
col5    0.3 0.0 0.3 0.3 1.0

这是我正在处理的实际问题的一个更简单的版本(100 行和数百万列,所以我最好有一个可以根据表格大小进行调整的解决方案)。

我一直在处理数组和循环,但还没有走得很远。

我当前的代码如下所示(未完成):

data ideal_output;
    set binary_table;
    array obs(10,5);
    array output(5,5);
    do i=1 to 5;
        do j=1 to 5;
            do k=1 to 10;
                do l=1 to 10;
        output(m,n) = sum(obs(k,i)*obs(l,j))/sum(obs(k,i));
    end;end;end;end;
run;

【问题讨论】:

  • 请将您的输入和所需输出表以文本形式而不是图像形式发布,也许有人会看看。
  • 谢谢!我只是改变了格式来做到这一点

标签: arrays loops sas probability


【解决方案1】:

您有正确的想法 - 棘手的部分是将所有变量加载到适当的数组中。如果您的完整数据集太大而无法放入内存,您可能需要一次处理其中的一个子集。

data have;
/*Set length 3 for binary vars to save a bit of memory later*/
length col1-col5 3;
input col1-col5;
cards;
1   0   1   0   0
0   0   0   1   1
0   0   0   0   0
1   0   0   0   0
1   0   0   0   1
0   1   0   0   0
0   1   0   1   0
1   1   1   1   0
1   0   1   0   1
1   0   1   0   0
;
run;

%let NCOLS = 5;
%let NOBS = 10;

data want;
    if 0 then set have;
    array obs[&NOBS,&NCOLS];
    array p[&NCOLS];
    array col[&NCOLS];

    /*Use a DOW-loop to populate the 2-d array*/
    do _n_ = 1 by 1 until (eof);
        set have end = eof;
        do i = 1 to &NCOLS;
            obs[_n_,i] = col[i];
        end;
    end;

    do i=1 to &NCOLS;
        do j=1 to &NCOLS;
            x = 0;
            y = 0;
            do k=1 to &NOBS;
                x + obs[k,i]*obs[k,j];
                y + obs[k,j];
            end;
            p[j] = x / y;
        end;
        output;
    end;
    keep p1-p5; 
run;

【讨论】:

  • 谢谢,这非常有帮助!仍在试图弄清楚如何在更大的数据集上扩展它,但这让我有了一个很好的开始!
  • 一种方法是遍历 col 数组的子集,而不是遍历整个数组。您可能需要进行一些试验以找到仍适合内存的最大大小,以尽量减少读取输入数据集所需的次数。
【解决方案2】:

您可能可以用摘要过程做一些等效的事情。这会有点混乱,因为您可能必须进行一些转置并摆脱“0”行,但这也许会让您开始?

proc tabulate data=have out=want;
  class col1-col5;
  tables (col1-col5),(col1-col5)*colpctn/printmiss misstext='0';
run;

data want_fortran;
  set want;
  if sum(of col1-col5) = 2;
run;

然后您可以使用 col1-col5 的哪些列被填充来生成列/行名称并转置数据集。

【讨论】:

    猜你喜欢
    • 2016-08-11
    • 2014-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-12
    相关资源
    最近更新 更多