如何在Stata中复制此类表格?

时间:2015-10-08 22:40:09

标签: stata

我的数据目前看起来像这样:

    Group   Team    Ind. 1990 1991
    Group 1  Blue    a   1   1
    Group 1  Blue    b   1   1
    Group 1  Blue    c       1
    Group 1  Green   a   1   1
    Group 1  Green   b   1   1
    Group 1  Green   c   1   1
    Group 1  Orange  a       1
    Group 1  Orange  b   1   1
    Group 1  Orange  c   1   1
    Group 2  Black   a   1   1
    Group 2  Black   b   1   1
    Group 2  Black   c   1   1
    Group 3  Grey    a   1  
    Group 3  Grey    b       1
    Group 3  Grey    c       1
    Group 3  Yellow  a   1   1
    Group 3  Yellow  b   1   1
    Group 3  Yellow  c  

我想将它总结为这种类型的表:

                                                        1990  1991
Group 1  No. of Teams with all ind. (i.e. a,b,AND c)     1      3
Group 1  No. of Teams missing a value in a,b,OR c        2      0
Group 2  No. of Teams with all ind. (i.e. a,b,AND c)     1      1
Group 2  No. of Teams missing a value in a,b,OR c        0      0
Group 3  No. of Teams with all ind. (i.e. a,b,AND c)     0      0
Group 3  No. of Teams missing a value in a,b,OR c        2      2

我尝试重塑我的数据(并将Year作为一个变量),然后使用egen命令:

egen test=count(Team), by (Group Year Team)

但是它只计算每个年份和每组完成的总行数。在任何情况下,它都没有考虑uniques团队。

1 个答案:

答案 0 :(得分:1)

假设在您的示例数据中,空白是缺失,相应的变量是数字。然后可以通过以下方式实现类似于您想要的东西:

clear
set more off

input ///
group str10 team  str1 ind y1990 y1991
 1  Blue    a   1   1
 1  Blue    b   1   1
 1  Blue    c   .    1
 1  Green   a   1   1
 1  Green   b   1   1
 1  Green   c   1   1
 1  Orange  a    .   1
 1  Orange  b   1   1
 1  Orange  c   1   1
 2  Black   a   1   1
 2  Black   b   1   1
 2  Black   c   1   1
 3  Grey    a   1  .
 3  Grey    b    .   1
 3  Grey    c    .   1
 3  Yellow  a   1   1
 3  Yellow  b   1   1
 3  Yellow  c  .    .
end

list, sepby(group team)

*----- (similar to) what you want -----

// set years
local years 1990 1991

// number of teams per -group-
bysort group (team) : egen numteam = total(team != team[_n-1])

// comply with "and" condition
foreach y of local years {
    bysort group team (y`y') : gen and`y' = y`y'[1] == y`y'[_N]
}

// compute counts of "and" conditions
collapse (first) and* numteam, by(group team)
collapse (sum) and* (first) numteam, by(group)

// compute counts of "exclusive or" conditions
foreach y of local years {
    gen xor`y' = numteam - and`y'
}

// print
drop numteam
list

对于任何年份和group team组合,请注意检查所有个体是否存在的策略:sort指标变量,如果第一个和最后一个观察结果相同,那么所有个体都在场(暂时丢弃所有值都丢失的情况)。如果它们不相同,则表示第一次观察中为1,最后一次为.,则至少有一个人不在场。

(我告诉你,让你进入你最初要求的完全结构。)

但通常的建议是使用 long 形式的数据,因为Stata中的大多数统计分析都比较容易。为此,首先reshape,然后完成剩下的工作:

<snip>

*----- what you want -----

// reshape data
gen i = _n
reshape long y, i(i) j(year)

// number of teams per -group-
bysort group (team) : egen numteam = total(team != team[_n-1])

// comply with "and" condition
rename (ind y) (id indicat)
bysort year group team (indicat) : gen and = indicat[1] == indicat[_N]

// compute counts of "and" conditions
collapse (first) and numteam, by(year group team)
collapse (sum) and (first) numteam, by(year group)

// compute counts of "exclusive or" conditions
gen xor = numteam - and

// pretty print
drop numteam
order group
sort group year
list, sepby(group)

第一段代码输出:

. list

     +-----------------------------------------------+
     | group   and1990   and1991   xor1990   xor1991 |
     |-----------------------------------------------|
  1. |     1         1         3         2         0 |
  2. |     2         1         1         0         0 |
  3. |     3         0         0         2         2 |
     +-----------------------------------------------+

和第二个:

. list, sepby(group)

     +--------------------------+
     | group   year   and   xor |
     |--------------------------|
  1. |     1   1990     1     2 |
  2. |     1   1991     3     0 |
     |--------------------------|
  3. |     2   1990     1     0 |
  4. |     2   1991     1     0 |
     |--------------------------|
  5. |     3   1990     0     2 |
  6. |     3   1991     0     2 |
     +--------------------------+

最后,请注意任何一年中所有缺失值的团队,例如:团队红色在1990年,下面:

     +--------------------------------------+
     | group     team   ind   y1990   y1991 |
     |--------------------------------------|
  1. |     1     Blue     a       1       1 |
  2. |     1     Blue     b       1       1 |
  3. |     1     Blue     c       .       1 |
     |--------------------------------------|
  .
  .
  .
     |--------------------------------------|
 19. |     4      Red     a       .       . |
 20. |     4      Red     b       .       1 |
 21. |     4      Red     c       .       1 |
     |--------------------------------------|
 22. |     4    White     a       1       1 |
 23. |     4    White     b       1       1 |
 24. |     4    White     c       .       . |
     +--------------------------------------+

因为这些被视为所有人都在场。

您需要确定在这种情况下计数的行为方式。一种调整方法是使用

bysort year group team (indicat) : gen and = indicat[1] == indicat[_N]  ///
    & !missing(indicat[1]) 

而不是相应的原件。在sort之后,我们只需要检查第一个值是否为非缺失值,以便丢弃所有值都丢失的情况。

修改

使用修改后的行以及原始示例数据运行代码,再加上包含所有缺失团队的第四个组(见上文),结果如下:

. list, sepby(group)

     +--------------------------+
     | group   year   and   xor |
     |--------------------------|
  1. |     1   1990     1     2 |
  2. |     1   1991     3     0 |
     |--------------------------|
  3. |     2   1990     1     0 |
  4. |     2   1991     1     0 |
     |--------------------------|
  5. |     3   1990     0     2 |
  6. |     3   1991     0     2 |
     |--------------------------|
  7. |     4   1990     0     2 |
  8. |     4   1991     0     2 |
     +--------------------------+

根据我定义的逻辑,这是我所期望的:如果团队拥有所有缺失值,则使用 exclusive或条件对其进行计数。如果你想遵循不同的逻辑,你需要i)拼写出来,然后ii)将其翻译成代码。

编辑2

如果在评论中指标变量可以采用任何正值,则可以概括用于计算条件的规则。将第五个组添加到示例数据中:

.
.    
.
    |--------------------------------------|
25. |     5     Blue     a       1       . |
26. |     5     Blue     b       1       . |
27. |     5     Blue     c       1       . |
28. |     5    Green     a       2       . |
29. |     5    Green     b       2       . |
30. |     5    Green     c       .       . |
31. |     5   Orange     a       3       . |
32. |     5   Orange     b       2       . |
33. |     5   Orange     c      55       . |
    +--------------------------------------+

并将相应的行修改为:

bysort year group team (indicat) : gen and = !missing(indicat[_N])

我只检查最后一个值(_N),因为在排序后,如果最后一个值没有丢失,那么根本没有遗漏。

如果不熟悉这些概念,请检查help subscriptinghelp bysort