2017-02-20 27 views
0

У меня есть «сырой» набор данных, который я пытаюсь очистить. Набор данных состоит из лиц с переменной age между 2000 и 2010 годами. В наборе данных имеется примерно 20000 человек с той же проблемой.Как использовать foreach/forv для замены дубликатов в порядке возрастания

Переменная age не увеличивается в 2004-2006 годах. Например, для одного человека это выглядит следующим образом:

2000: 16, 
2001: 17, 
2002: 18, 
2003: 19, 
2004: 19, 
2005: 19, 
2006: 19, 
2007: 23, 
2008: 24, 
2009: 25, 
2010: 26, 

До сих пор я пытался генерировать переменные для максимального возраста и макс года:

bysort id: egen last_year=max(year) 
bysort id: egen last_age=max(age) 

, а затем использовать foreach в сочетании с лагами попробовать заменить age переменную в порядке убывания так, что, когда новая переменная last_age (что теперь 26 за все годы), а выглядит следующим образом:

2010: 26 
2009: 25 (26-1) 
2008: 24 (26-2) , and so on. 

Однако у меня есть некоторые проблемы с поиском правильного кода для этой проблемы.

ответ

1

Предполагая, что для каждого человека, первое значение возраста не отсутствующего и является правильным, что-то подобное может работать

bysort id (year): replace age = age[1]+(year-year[1]) 

В качестве альтернативы, если последнее значение возраста предполагается всегда быть точным,

bysort id (year): replace age = age[_N]-(year[_N]-year) 

Или просто исправить возрасты, где нет никаких изменений наблюдения к наблюдению в возрасте

bysort id (year): replace age = age[_n-1]+(year-year[_n-1]) if _n>1 & age==age[_n-1] 

В отсутствие данных образцов ни один из них не был протестирован.

+0

Спасибо за ваш ответ. Альтернатива 2 работала :) –

0

Код Уильяма очень кстати, но несколько дополнительных замечаний не будут легко вписываться в комментарий.

Предположим, что мы имеем age уже и генерировать две другие оценки, идущие вперед и назад, как он говорит:

bysort id (year): gen age2 = age[1] + (year - year[1]) 
bysort id (year): gen age3 = age[_N] - (year[_N] - year) 

Теперь, если все три соглашаются, что мы хороши, и если два из трех согласны, мы, вероятно, использовать большинство голосов. В любом случае, это медиана; медиана будет, для 3 значений, суммой MINUS минимальным MINUS максимальным.

gen median = (age + age2 + age3) - max(age, age2, age3) - min(age, age2, age3) 

Если мы получим три разные оценки, мы должны смотреть внимательнее.

edit age* if max(age, age2, age3) > median & median > min(age, age2, age3) 

Заключительный тест является ли увеличить медианы таким же образом, как и годы:

bysort id (year) : assert (median - median[_n-1]) == (year - year[_n-1]) if _n > 1