首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用foreach / forv以递增的顺序替换重复项

如何使用foreach / forv以递增的顺序替换重复项
EN

Stack Overflow用户
提问于 2017-02-20 20:45:29
回答 2查看 129关注 0票数 0

我有一个“原始”的数据集,我正试图清理它。数据集由2000年到2010年之间变量为age的个人组成。在数据集中大约有20000个人有同样的问题。

变量age在2004年至2006年期间不会增加。例如,对于一个人,它看起来是这样的:

代码语言:javascript
复制
2000: 16, 
2001: 17,
2002: 18,
2003: 19,
2004: 19,
2005: 19,
2006: 19,
2007: 23,
2008: 24,
2009: 25,
2010: 26,

到目前为止,我已经尝试为最大年龄和最大年份生成变量:

代码语言:javascript
复制
bysort id: egen last_year=max(year)
bysort id: egen last_age=max(age) 

然后结合使用foreach和lags来尝试按降序替换age变量,这样当新变量last_age (现在所有年份都是26 )看起来像这样时:

代码语言:javascript
复制
2010: 26
2009: 25 (26-1)
2008: 24 (26-2) , and so on. 

但是,我在为这个问题找到正确的代码时遇到了一些问题。

EN

回答 2

Stack Overflow用户

发布于 2017-02-20 20:59:39

代码语言:javascript
复制
bysort id (year): replace age = age[1]+(year-year[1])

或者,如果假设年龄的最后一个值总是准确的,

代码语言:javascript
复制
bysort id (year): replace age = age[_N]-(year[_N]-year)

或者,只需确定年龄中没有观察值到观察值变化的年龄

代码语言:javascript
复制
bysort id (year): replace age = age[_n-1]+(year-year[_n-1]) if _n>1 & age==age[_n-1]

在缺乏样本数据的情况下,这些都没有经过测试。

票数 1
EN

Stack Overflow用户

发布于 2017-02-20 23:37:58

William的代码非常切中要害,但是一些额外的注释很难放入注释中。

假设我们已经有了age,并按照他的建议生成了另外两个向前和向后的估计:

代码语言:javascript
复制
bysort id (year): gen age2 = age[1] + (year - year[1])
bysort id (year): gen age3 = age[_N] - (year[_N] - year)

现在,如果三个人都同意,我们就很好,如果三个人中有两个同意,我们可能会使用多数票。无论哪种情况,这都是中位数;对于3个值,中位数将是总和减去最小值和最大值。

代码语言:javascript
复制
gen median = (age + age2 + age3) - max(age, age2, age3) - min(age, age2, age3) 

如果我们得到三种不同的估计,我们应该更仔细地查看。

代码语言:javascript
复制
edit age* if max(age, age2, age3) > median & median > min(age, age2, age3) 

最后一个测试是中位数是否以与年份相同的方式增加:

代码语言:javascript
复制
bysort id (year) : assert (median - median[_n-1]) == (year - year[_n-1]) if _n > 1 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42344958

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档