首页 > 解决方案 > 满足条件语句的所有组的计数

问题描述

这个周末我想出了一个解决方案,同时致力于创建一个符合 SO 准则的帖子。我很抱歉在第一篇文章中没有给你们任何东西。

我的解决方案是将我感兴趣的数据折叠到一个计数数据集中,然后为满足条件表达式的那些组进行制表符:

例子:

假设我想按种族和性别分析年龄组之间的政党归属。在进一步了解之前,我想确保我拥有运行正确分析所需的细胞计数。我想检查每个年龄组有多少种族对政党有至少 10 次观察,以及按性别划分的年龄组对政党有至少 10 次观察。而且我懒得从直接选项卡中计算满足此条件的组数,所以我希望 Stata 为我做这件事(对于具有许多分组(如县或邮政编码)的大型调查数据必不可少)。

使用威斯康星大学统计网站( https://www.ssc.wisc.edu/sscc/pubs/sfs/sfs-files.htm )提供的 2014 年一般社会调查数据集的子集

use https://www.ssc.wisc.edu/sscc/pubs/sfs/gss_sample.dta

* Streamline dataset
keep sex age race partyid 

*Create age group variable
gen agegroup = .
replace agegroup=1 if age<=25
replace agegroup=2 if age>25 & age <=35
replace agegroup=3 if age>35 & age<=45
replace agegroup=4 if age>45 & age <=55
replace agegroup=5 if age>55 & age <=65
replace agegroup=6 if age>65
label var agegroup "Age Groups"
lab def grouplab 1 "25 or younger" 2 "26 to 35" 3 "36 to 45" 4 "46 to 55" 5 "56 to 65" 6 "65 and older"
lab val agegroup grouplab


collapse (count) numparty=partyid, by(agegroup race)
list
tab agegroup race if numparty>10

* 对政党至少有 10 次回应的唯一黑人受访者年龄组为 26 至 35 岁;所有白人年龄组对派对 ID 至少有 10 条回复

clear
use https://www.ssc.wisc.edu/sscc/pubs/sfs/gss_sample.dta

* Streamline dataset
keep sex age race partyid 

*Create age group variable
gen agegroup = .
replace agegroup=1 if age<=25
replace agegroup=2 if age>25 & age <=35
replace agegroup=3 if age>35 & age<=45
replace agegroup=4 if age>45 & age <=55
replace agegroup=5 if age>55 & age <=65
replace agegroup=6 if age>65
label var agegroup "Age Groups"
lab def grouplab 1 "25 or younger" 2 "26 to 35" 3 "36 to 45" 4 "46 to 55" 5 "56 to 65" 6 "65 and older"
lab val agegroup grouplab


collapse (count) numparty=partyid, by(agegroup sex)
list
tab agegroup sex if numparty>10

* 男性中 5/6 年龄组对派对 id 的回答超过 10 次,而女性年龄组中 6/6 对派对 id 的回答超过 10 次

这些例子有点荒谬,但结构是我想出的,并与我的真实数据一起工作。请给我您的反馈。我知道这对你们大多数人来说可能是显而易见的,并且可能有一个更优雅的解决方案。

原帖:


我是来自 R 的 Stata 新手,无法解决一个看似简单的问题。处理调查数据,我需要知道有多少组在我的调查中每年有 50 多个观察值。我不关心观察的价值,只关心他们是否回答了问题项(非缺失)。理想的输出将是单个数字(即,如果总共 35 组中的 33 组满足条件,则为“33”)。我试过 count 和 sum 以及各种“by”语句。

我希望有这样的结果,其中 33 个组在第一年有 50+ 个 obs,20 个组在第 2 年有 50+ 个 obs,29 个组在第 3 年有 50+ 个 obs:

| 第一年 | 第二年| 第三年| 33 20 29

当我弄清楚如何这样做时,我会发布一些虚假的较小数据。

标签: statasurvey

解决方案


不规则的分类最好完全明确地完成。这是一种方法:它不是特别简洁,但它应该具有相当的指导性并且易于理解。

* toy dataset for any one who wants to play 
clear
input age 
15
25
35
45
55
65
75 
end 

* OP's method 
gen agegroup = .
replace agegroup=1 if age<=25
replace agegroup=2 if age>25 & age <=35
replace agegroup=3 if age>35 & age<=45
replace agegroup=4 if age>45 & age <=55
replace agegroup=5 if age>55 & age <=65
replace agegroup=6 if age>65

* another way to do it 
gen also = 6 
local limits 65 55 45 35 25 
quietly forval j = 5(-1)1 { 
    gettoken this limits : limits 
    replace also = `j' if age <= `this' 
} 

* compare results
list  

推荐阅读