Stata 满足条件语句的所有组的计数

Stata 满足条件语句的所有组的计数,stata,survey,Stata,Survey,这个周末,我在创建一篇符合SO准则的帖子时,想出了一个解决方案。很抱歉,在第一篇文章中,我没有给你们任何可以合作的东西 我的解决方案是将我感兴趣的数据折叠成计数数据集,然后为满足条件表达式的组设置制表符: 例如: 比如说,我想通过种族和性别来分析各年龄组之间的政党关系。在我做进一步的研究之前,我想确定我有进行适当分析所需的细胞计数。我想检查有多少种族对每个年龄组至少有10次政党观察,有多少性别年龄组至少有10次政党观察。而且我太懒了,无法从一个直接的选项卡中计算满足此条件的组数,所以我希望Sta

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

我的解决方案是将我感兴趣的数据折叠成计数数据集,然后为满足条件表达式的组设置制表符:

例如:

比如说,我想通过种族和性别来分析各年龄组之间的政党关系。在我做进一步的研究之前,我想确定我有进行适当分析所需的细胞计数。我想检查有多少种族对每个年龄组至少有10次政党观察,有多少性别年龄组至少有10次政党观察。而且我太懒了,无法从一个直接的选项卡中计算满足此条件的组数,所以我希望Stata为我做这件事(对于包含许多组(如县或Zipcode)的大型调查数据至关重要)

使用2014年综合社会调查数据集的一个子集,可在()

使用https://www.ssc.wisc.edu/sscc/pubs/sfs/gss_sample.dta
*流线型数据集
保持性年龄种族派对
*创建年龄组变量
年龄组=。
如果年龄为25岁、35岁、45岁、55岁和65岁,则替换年龄组=1
标签变量年龄组“年龄组”
实验室def组实验室1“25或以下”2“26至35”3“36至45”4“46至55”5“56至65”6“65及以上”
实验室值年龄组组组实验室
折叠(计数)numparty=partyid,按(年龄组种族)
列表
tab年龄组比赛(如果numparty>10)
*黑人受访者中唯一对政党有至少10个回应的年龄组是26至35岁;所有白人年龄组对party 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
清除
使用https://www.ssc.wisc.edu/sscc/pubs/sfs/gss_sample.dta
*流线型数据集
保持性年龄种族派对
*创建年龄组变量
年龄组=。
如果年龄为25岁、35岁、45岁、55岁和65岁,则替换年龄组=1
标签变量年龄组“年龄组”
实验室def组实验室1“25或以下”2“26至35”3“36至45”4“46至55”5“56至65”6“65及以上”
实验室值年龄组组组实验室
折叠(计数)numparty=partyid,按(年龄组性别)
列表
选项卡年龄组性别(如果numparty>10)
*5/6的男性年龄组对政党id的反应超过10次,6/6的女性年龄组对政党id的反应超过10次

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

原职:


我刚从R来到斯塔塔,在解决一个看似简单的问题时遇到了困难。在处理调查数据时,我需要知道有多少组在我的调查中每年有50多个观察。我不关心观察结果的价值,只关心它们是否回答了问题项(非缺失)。理想输出为单个数字(即,如果总共35个组中的33组满足条件,则为“33”)。我试过计数和求和以及各种各样的“by”语句

我希望有这样的情况,其中33组在第一年有50多个obs,20组在第二年有50多个obs,29组在第三年有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  
*玩具数据集,适合任何想玩的人
清楚的
输入年龄
15
25
35
45
55
65
75
结束
*OP法
年龄组=。
如果年龄为25岁、35岁、45岁、55岁和65岁,则替换年龄组=1
*另一种方法
发电机也=6
本地限制65 55 45 35 25
静forval j=5(-1)1{
获得此限制:限制

如果您的问题不清楚,请阅读并提供using Stata的
dataex
命令。如果我们没有看到您的数据示例,我们将无法帮助您。此外,请提供您尝试过的代码。通用语句,如“我尝试过计数和求和”以及所有形式的“by”语句没有帮助。谢谢你的诚实反馈我知道这是一个写得很糟糕的问题。这里有具体的问题吗?你似乎已经回答了你自己的问题。在这里,你能做的唯一更“优雅”的事情是使用
egen agegroup=cut(age),at(0,26,36,46,56,66,89)标签
而不是单个的
replace
命令。25、35、45、55、65是类限制,OP希望它们包含在下面的类中。这很公平,但
cut()确实不明显
就是这样做的。完全可能有运行小于25、25或更多但小于35的类,等等。也就是说,是类(-infinity,x1),[x1,x2),…或(-infinity,x1],(x1,x2],…cut做OP想要做的事情,但问题是对于被告知或看到代码的读者
egen,cut()
并且需要知道它的作用。自然,一个细心的记者会在某个地方解释哪些不等式是
为什么这个问题会被重新打开?这里没有什么可以回答的。@PearlySpiner OP希望得到关于他们代码的反馈。这不是一个精确的问题,但反馈是完全可能的:你自己给出了一些。证据y其他人不同意你的观点,他们不太可能会读到这篇文章,因为许多不遵循特定标签的成员只是在观看评论队列。(我不记得我是否投票赞成重新打开。)我在评论中给出了反馈,因为不可能给出完整的答案。这里没有具体的问题。除了你的投票外,不同意并投票重新打开问题的人都是android开发者……系统不完善,有时民主会产生人们认为错误的决定。听起来熟悉吗?(我不同意这里的细节,因为线程可以使OP和其他应用程序变得有用和有趣
* 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