楼主: smztsmzt
722 0

[学习心得] Stata 排列组合 完全枚举从k个数中选取c个数的分组情况和组合模式 [推广有奖]

  • 0关注
  • 9粉丝

已卖:1516份资源

硕士生

4%

还不是VIP/贵宾

-

威望
0
论坛币
2984 个
通用积分
407.5325
学术水平
73 点
热心指数
72 点
信用等级
62 点
经验
1206 点
帖子
51
精华
0
在线时间
131 小时
注册时间
2011-4-7
最后登录
2025-3-17

楼主
smztsmzt 在职认证  发表于 2023-12-3 21:15:19 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
  1. /*
  2. 问题需求:
  3. 一个地区16个村,8个村为干预,8个村为对照,
  4. 考察所有随机化分组的基线变量平衡情况
  5. 从K个村里任选c个村,有k!/(c!*(k-c)!)种

  6. 解决思路:
  7. 我们只需要知道干预组和对照组,用0和1表示即可,这样可以不用计算16的阶乘
  8. 只用考虑16个变量,每个变量包含2个元素1和0,这16个变量的组合,2的16次方
  9. 然后再删除行合计不等于8的即可

  10. 优势:
  11. 1. 突破percom等命令包中因为排列计算过大对选取数c的限制
  12. 2. 突破被选取数k太大,造成的内存不足限制
  13. 3. 可以生成原始数值的组合或者指示变量的分组
  14. */

  15. clear
  16. local k=6 // 从k个数中一次性选取c个数
  17. local c=2
  18. di "组合数:" exp(lnfactorial(`k'))/(exp(lnfactorial(`c'))*exp(lnfactorial(`k'-`c')))

  19. set obs 2
  20. forvalues i=1/`k'{
  21.     gen v`i'=1 in 1
  22.         replace v`i'=0 in 2
  23. }
  24. di "记录数:" 2^`k'
  25. fillin v* // 2^k条记录数,受电脑内存限制

  26. // 以下代码生成指示变量的分组
  27. egen rt=rowtotal(v1-v`k')
  28. drop if rt!=`c' // 删除不需要的组合数
  29. drop _fillin rt
  30. d,s

  31. // 以下代码继续生成带原始数值的组合
  32. forvalues i=1/`k' {
  33.     gen t`i'="`i'" if v`i'==1
  34. }

  35. egen cv=concat(t1-t`k'),punct(" ")
  36. replace cv=strtrim(stritrim(cv))
  37. keep cv
  38. split cv,generate(v) destring
  39. drop cv
  40. compress
复制代码

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Stata tata Factorial forvalues forvalue

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jltj
拉您入交流群
GMT+8, 2026-1-18 06:47