【问题标题】:Stata - generate sum of all possible combinations of idStata - 生成id的所有可能组合的总和
【发布时间】:2023-02-20 02:36:12
【问题描述】:

我有一个结构如下所示的数据集:

    Group ID Value
    1 A 10
    1 B 15
    1 C 20
    2 D 10
    2 E 25

在每个组中,我想获得两个或多个 ID 的所有可能组合的总和。例如,在第 1 组中,我可以有以下组合:AB、AC、BC、ABC。因此,对于第 1 组,我总共有四种可能的组合,我想从中获得变量值的总和。 我正在使用大小为 R 的组中 N 个元素的组合公式来确定我需要添加到数据集中的观测值有多少才能获得足够的观测值。 对于第 1 组,我需要的观察次数是:

3!/((3-2)!*2!)*2 = 6 对于两个 ID 组合 3!/(3-3)!*3!)*3 = 3 对于三个 ID 组合。

所以一共9次观察。由于我已经有三个,我可以使用命令:expand 6 if Group==1。对于第 1 组,我会得到类似

    Group ID Value
    1 A 10
    1 B 15
    1 C 20
    1 A 10
    1 B 15
    1 C 20
    1 A 10
    1 B 15
    1 C 20

现在,我被困在这里如何继续告诉 Stata 识别组合并创建求和。理想情况下,我想创建两个新变量,以识别元组并获得总和,因此看起来像:

    Group ID Value Touple Sum
    1 A 10 AB 25
    1 B 15 AB 25
    1 A 10 AC 30
    1 C 20 AC 30
    1 B 15 BC 35
    1 C 20 BC 35
    1 A 10 ABC 45
    1 B 15 ABC 45
    1 C 20 ABC 45

这样,我就可以删除组和元组方面的重复项。一旦我有了 Tuples 变量,得到总和就很简单了,但是得到 Tuples,我就无法理解它了。 关于如何做到这一点的任何建议?

【问题讨论】:

    标签: tuples combinations stata


    【解决方案1】:

    我尝试使用嵌套循环和 tuples 命令来执行此操作。

    首先我创建并保存一个临时文件来存储结果:

    clear 
    tempfile group_results 
    save `group_results', replace emptyok 
    

    然后我输入并保存数据,以及一个本地的组数:

    clear 
    input Group str1 ID Value
        1 A 10
        1 B 15
        1 C 20
        2 D 10
        2 E 25 
        2 F 13    // added to test
        2 G 2     // added to test
    end 
    
    sum Group 
    local num_groups = r(max)
    
    tempfile base 
    save `base', replace 
    

    这是代码的核心。此处的外循环遍历组。然后它列出该组中的 ID,并使用 tuples 命令列出这些 ID 的唯一组合,最小大小为 2。k 循环遍历元组的数量和 m loop 是元组成员资格的指标。

    forvalues i = 1/`num_groups' {
        display "Starting Group `i'"
        use `base' if Group==`i', clear 
        * Make list of IDs to get unique combos of 
        forvalues j = 1/`=_N' {
            local tuple_list`i' = "`tuple_list`i'' " + ID[`j']
        }
        * Get all unique combos in list using tuples command
        tuples `tuple_list`i'', display min(2)
        forvalues k = 1/`ntuples' {
            display "Tuple `k':  `tuple`k''"
            local length = wordcount("`tuple`k''")
            gen intuple=0
            gen tuple`k'="`tuple`k''"
            forvalues m = 1/`length' {
                replace intuple=1 if ID==word("`tuple`k''",`m')
            }
            * Calculate sum of values in that tuple
            gegen group_sum`k' = sum(Value) if intuple==1 
            drop intuple 
            list 
        }
        * Reshape into desired format
        reshape long tuple group_sum, i(Group ID Value) j(tuple_num)
        drop if missing(group_sum)
        sort tuple_num 
        list 
        append using `group_results'
        save `group_results', replace 
    }
    
    * Full results
    use `group_results', clear 
    sort Group tuple_num
    list 
    

    我希望这有帮助。 list 命令会给你一个繁忙的结果窗口,但它显示了所有发生的事情。如果您的数据实际上要大得多,这可能效率低下!

    【讨论】:

      猜你喜欢
      • 2022-08-22
      • 2011-09-05
      • 2016-01-07
      • 2022-01-18
      • 2016-08-16
      相关资源
      最近更新 更多