stata - 满足条件语句的所有组的计数
问题描述
这个周末我想出了一个解决方案,同时致力于创建一个符合 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
当我弄清楚如何这样做时,我会发布一些虚假的较小数据。
解决方案
不规则的分类最好完全明确地完成。这是一种方法:它不是特别简洁,但它应该具有相当的指导性并且易于理解。
* 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
推荐阅读
- wordpress - 用户登录后,他们将被定向到重力表单 - 只有当它完成后,他们才会被定向到该站点
- node.js - express-session 对会话 id cookie 使用什么哈希算法?
- android - 为自定义视图调用了错误的文本更改侦听器
- android-studio-3.4 - 关于通过进行一些查询从 SQLite 数据库中获取确切的整数值
- ios - SwiftUI 添加自定义 UIViewControllerTransitioningDelegate
- google-chrome - 灯塔报告;发现不安全的请求
- sql-server - 如何修复错误“SQLexception 未处理,用户代码不正确的语法靠近'FROM'
- javascript - 在 try 块中使用异步函数
- javascript - ngOnInit() 中的 Angular 8 Http Observables
- javascript - 当我重新加载页面时,我的 vue-router 不会加载组件,但会在我转换时加载