我认为我的问题与此类似:Drop observations in panel data using Stata 但我仍然做错了什么,它对我来说并不适合。
我的面板数据包含以下变量:
Year
- Month
- Subject
- Trial
- Attempt
- Reward
每个受试者有4次试验(或轮次),每轮5次尝试。奖励通过尝试和回合而变化,第5次(最后)尝试总是= 2.对于每个受试者,随机选择4个试验中的一个以使所有5次尝试具有reward = 2
(通常尝试1-4具有reward = 1
{1}})。我需要删除那些"奖励试验"。
我知道我需要使用by
(http://www.stata.com/manuals13/dby.pdf),但我似乎做错了。如果我这样做:
by trial: drop if attempt == 2 & reward == 2
然后我得到
没有排序。
如果我这样做:
by trial, sort: drop if attempt == 2 & reward == 2
当我需要它放弃该试验中的所有5个观察结果时,它会丢掉1个观察结果。
数据示例:
* Example generated by -dataex-. To install: ssc install dataex
clear
input int Year str3 Month byte(Subject Trial Attempt Reward) str1 Todrop
2016 "Feb" 1 1 1 1 ""
2016 "Feb" 1 1 2 1 ""
2016 "Feb" 1 1 3 1 ""
2016 "Feb" 1 1 4 1 ""
2016 "Feb" 1 1 5 2 ""
2016 "Feb" 1 2 1 1 ""
2016 "Feb" 1 2 2 1 ""
2016 "Feb" 1 2 3 1 ""
2016 "Feb" 1 2 4 1 ""
2016 "Feb" 1 2 5 2 ""
2016 "Feb" 1 3 1 2 "*"
2016 "Feb" 1 3 2 2 "*"
2016 "Feb" 1 3 3 2 "*"
2016 "Feb" 1 3 4 2 "*"
2016 "Feb" 1 3 5 2 "*"
2016 "Feb" 2 1 1 1 ""
2016 "Feb" 2 1 2 1 ""
2016 "Feb" 2 1 3 1 ""
2016 "Feb" 2 1 4 1 ""
2016 "Feb" 2 1 5 2 ""
2016 "Feb" 2 2 1 2 "*"
2016 "Feb" 2 2 2 2 "*"
2016 "Feb" 2 2 3 2 "*"
2016 "Feb" 2 2 4 2 "*"
2016 "Feb" 2 2 5 2 "*"
2016 "Feb" 2 3 1 1 ""
2016 "Feb" 2 3 2 1 ""
2016 "Feb" 2 3 3 1 ""
2016 "Feb" 2 3 4 1 ""
2016 "Feb" 2 3 5 2 ""
end
以上是两个科目的例子。我希望能够做的是放弃对象1的所有试验3,对于对象2(已加星标的试验)的所有试验2,但不放弃其他试验(非星级试验)。也就是说,变量Todrop
为*
,观察结果为drop
ped,否则为空。
答案 0 :(得分:1)
假设您的示例中已读入数据,您可以通过
确定drop
的观察结果
bysort Year Month Subject Trial (Reward) : gen todrop = Reward[1] == 2 & Reward[5] == 2
原则是:
通过变量的交叉组合定义组。如你所说,by:
在这里提供了一个框架。
Reward
的每个值必须为2组,才能drop
ped。如果是这样,那么在sort
组Reward
之后,第一个和最后一个值都是2是必要且充分的。
当且仅当todrop
为Todrop
时,请确认上面定义的*
为1。 (例如,查看tabulate *drop, missing
)。
一旦满意,
drop if todrop
答案 1 :(得分:0)
gen flag_temp=1 if attempt == 2 & reward == 2
bysort trial: egen flag=min(flag_temp)
drop if flag==1
<强>动臂强>