楼主: fugangxx
1818 18

[编程问题求助] stata 编程问题求助 [推广有奖]

11
fugangxx 在职认证  发表于 2021-8-13 22:27:41
谢谢楼主提供的好方法,我回了消息,有时候好久不显示,有时一下子显示好些
您的思路很精巧,我刚才一直用keys[_n]和 keys[_n-1]在想办法,还是seq[_n]好,
seq[_n-1]  != . 我以为当seq为从第一即开始时,可能会出现例外,但试验后发现程序可行

12
zdlspace 学生认证  发表于 2021-8-13 23:33:05
pengxhan 发表于 2021-8-13 19:24
纯粹为了练习 我编写了下面命令可识别不连续 不用spell
bys group:egen seq=seq() if keys=="b"
egen  m ...
你确定这代码行吗?是不是要检查一下哪里有问题?举个例子:
  1. clear
  2. input str1 keys float group
  3. "a" 1
  4. "b" 1
  5. "b" 1
  6. "d" 1
  7. "g" 1
  8. "g" 1
  9. "h" 1
  10. "m" 1
  11. "a" 2
  12. "b" 2
  13. "b" 2
  14. "b" 2
  15. "c" 2
  16. "f" 2
  17. "g" 2
  18. "h" 2
  19. "m" 2
  20. "a" 3
  21. "b" 3
  22. "b" 3
  23. "b" 3
  24. "c" 3
  25. "c" 3
  26. "c" 3
  27. "d" 3
  28. "d" 3
  29. "m" 3
  30. "a" 4
  31. "b" 4
  32. "b" 4
  33. "f" 4
  34. "b" 4
  35. "b" 4
  36. "c" 4
  37. "b" 4
  38. "d" 4
  39. "m" 4
  40. end

  41. bys group:egen seq=seq() if keys=="b"
  42. egen  max=max(seq) if  seq[_n-1]!=.
  43. levelsof  max

  44. . list

  45.      +--------------------------+
  46.      | keys   group   seq   max |
  47.      |--------------------------|
  48.   1. |    a       1     .     . |
  49.   2. |    b       1     1     . |
  50.   3. |    b       1     2     4 |
  51.   4. |    d       1     .     4 |
  52.   5. |    g       1     .     . |
  53.      |--------------------------|
  54.   6. |    g       1     .     . |
  55.   7. |    h       1     .     . |
  56.   8. |    m       1     .     . |
  57.   9. |    a       2     .     . |
  58. 10. |    b       2     1     . |
  59.      |--------------------------|
  60. 11. |    b       2     2     4 |
  61. 12. |    b       2     3     4 |
  62. 13. |    c       2     .     4 |
  63. 14. |    f       2     .     . |
  64. 15. |    g       2     .     . |
  65.      |--------------------------|
  66. 16. |    h       2     .     . |
  67. 17. |    m       2     .     . |
  68. 18. |    a       3     .     . |
  69. 19. |    b       3     1     . |
  70. 20. |    b       3     2     4 |
  71.      |--------------------------|
  72. 21. |    b       3     3     4 |
  73. 22. |    c       3     .     4 |
  74. 23. |    c       3     .     . |
  75. 24. |    c       3     .     . |
  76. 25. |    d       3     .     . |
  77.      |--------------------------|
  78. 26. |    d       3     .     . |
  79. 27. |    m       3     .     . |
  80. 28. |    a       4     .     . |
  81. 29. |    b       4     1     . |
  82. 30. |    b       4     2     4 |
  83.      |--------------------------|
  84. 31. |    f       4     .     4 |
  85. 32. |    b       4     3     . |
  86. 33. |    b       4     4     4 |
  87. 34. |    c       4     .     4 |
  88. 35. |    b       4     5     . |
  89.      |--------------------------|
  90. 36. |    d       4     .     4 |
  91. 37. |    m       4     .     . |
  92.      +--------------------------+
复制代码
结果似乎不对哦,最大应该是3,你的代码返回的是4

13
zdlspace 学生认证  发表于 2021-8-14 12:39:34
fugangxx 发表于 2021-8-13 22:27
谢谢楼主提供的好方法,我回了消息,有时候好久不显示,有时一下子显示好些
您的思路很精巧,我刚才一直用 ...
当b不连续时,上述代码依然是错的,请看上面的例子

14
pengxhan 发表于 2021-8-14 23:05:40
bys group:gen tag=1 if keys=="b"
egen x=anycount(tag) if tag[_n+1]==.&tag[_n-1]!=.,v(1)
gen g=sum(x) if x==1
fillmissing g, with(next)
bys g:egen sum=sum(tag)
egen want=max(sum)
levelsof want
有多个连续区间的最终解决办法 纯粹为了练习其实 spell命令已经很简洁了

15
fugangxx 在职认证  发表于 2021-8-14 23:12:58
谢谢zdlspace,您很严谨,很棒,点赞!!!
问题出在egen  max=max(seq) if  seq[_n-1]!=.   这一句上,seq[_n-1]指的是上一个序列,而不是上上个单元格。因此当间隔一个单元格再出现序列时仍满足条件,即出现图形中的情况时满足seq[_n-1] !=.但中间有单个的单元格,或者出现了其他连续序列,seq[_n-1]指b序列,因此这些情况下,即b序列上方再出现了一个b序列则满足条件seq[_n-1]!=.,不连续的2组b序列,bb和bb被统计为4个b, 不知道我分析得对吗?欢迎大家积极献计献策。

其他序列.png (11.72 KB)

其他序列.png

问题来源.png (8.89 KB)

问题来源.png

16
fugangxx 在职认证  发表于 2021-8-15 07:30:29
回答了好几次,有图有真相却没有显示出来,我有了把单个出现的b过滤掉的好办法

bys group:gen a=1 if keys=="b"
replace a = . if (keys[_n] != keys[_n-1] & keys[_n] != keys[_n+1])

gen a=1 if keys=="b" & (keys[_n] == keys[_n-1] | keys[_n] == keys[_n+1])            /* 等同以上两句  将单个出现的b过滤掉*/

17
zdlspace 学生认证  发表于 2021-8-15 13:21:36
fugangxx 发表于 2021-8-14 23:12
谢谢zdlspace,您很严谨,很棒,点赞!!!
问题出在egen  max=max(seq) if  seq[_n-1]!=.   这一句上,s ...
数据处理是实证的第一步,必须得严谨,一旦数据处理出了问题,后面无论你采用什么高大上的模型,结果都毫无意义了

18
fugangxx 在职认证  发表于 2021-8-15 23:18:19
谢谢的付出,谢谢,谢谢您提供了很好的思路
用上面的数据是可行的,但是随意地多输入几次数据,结果还是不符,如下数据


. dataex

----------------------- copy starting from the next line -----------------------
  1. * Example generated by -dataex-. For more info, type help dataex
  2. clear
  3. input str1 keys float group
  4. "b" 1
  5. "d" 1
  6. "b" 1
  7. "a" 1
  8. "g" 1
  9. "h" 1
  10. "b" 1
  11. "a" 1
  12. "b" 1
  13. "g" 1
  14. "b" 1
  15. "b" 1
  16. "b" 2
  17. "b" 2
  18. "b" 2
  19. "b" 2
  20. "b" 2
  21. "b" 2
  22. "b" 2
  23. "c" 2
  24. "b" 2
  25. "b" 3
  26. "b" 3
  27. "b" 3
  28. "d" 3
  29. "b" 3
  30. "a" 3
  31. "n" 3
  32. "b" 3
  33. "c" 3
  34. "d" 3
  35. "b" 3
  36. "b" 4
  37. "b" 4
  38. "f" 4
  39. "b" 4
  40. "b" 4
  41. "b" 4
  42. "a" 4
  43. "b" 4
  44. "c" 4
  45. "d" 4
  46. end
复制代码

------------------ copy up to and including the previous line ------------------

Listed 42 out of 42 observations
第一组连续的b是2个,第二组连续的b是7个,4个,第三组连续的b是3个,第四组连续的2个,3个,所以最大连续b是7个,按各组计分别是2个,7个,3个和3个。按程序得出的结果是13个连续的b.
egen x=anycount(tag) if tag[_n+1] ==. & tag[_n-1]!=. , v(1)
生成的仅考虑连续的b,未考虑原分组group,即使不考虑任何分组情况,连续b的最大个数是9,而不是13
所以程序可能还有疑问



分组.png (18.4 KB)

分组.png

19
fugangxx 在职认证  发表于 2021-8-15 23:32:33
谢谢大家的热心帮助,热心的朋友们为此花费了不少时间,非常感谢!其实我在统计数据时增加了一个条件,原数据在每组仅有一组特定值b,而且位置是连续的,但是b个数不定(至少1个,或3-5个,多至十余个),所以 问题已经解决了,当时增加条件提出来就是想多学习各种数据操作的方法。谢谢大家。再次感谢楼上几位热心的朋友。
再加一个问题,我悬赏的论坛币怎么转给有建设性思路方法或者热心回复的朋友们呢?方便的话请帮忙截图标识一下

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

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