【问题标题】:drop section of panel data in Stata在Stata中删除面板数据部分
【发布时间】:2016-05-19 20:39:53
【问题描述】:

我想我的问题和这个类似: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 )。我需要删除那些“奖励试验”。

我知道我需要使用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*,观察结果为dropped,否则为空。

【问题讨论】:

  • 我建议进行一些修改,以在很大程度上改进问题的格式。但是,如果没有样本数据和可重现的示例,您可能会发现很难得到答案。如果有帮助,请看这里:stackoverflow.com/help/mcve
  • 嘿,阿米,请看我的回答。如果可行,请接受。谢谢
  • 我已经编辑了您的数据示例,以便可以将其作为 input 代码直接复制并粘贴到 Stata 中。有关执行此操作的方法,请参阅 dataex (SSC)。

标签: stata


【解决方案1】:

假设按照您的示例读取数据,您可以通过

识别drop的哪些观察结果
 bysort Year Month Subject Trial (Reward) : gen todrop = Reward[1] == 2 & Reward[5] == 2

原则是:

  1. 通过变量的交叉组合定义组。正如你所说,by: 在这里给出了一个框架。

  2. Reward 的每个值必须在组中为 2 才能成为 dropped。如果是这样,那么在组内sortReward 执行sort 之后,第一个和最后一个值都是2 是必要且充分的。

验证上面定义的todrop 是1 当且仅当Todrop*。 (例如查看tabulate *drop, missing)。

一旦满意,

drop if todrop 

更多信息请访问this Stata FAQ

【讨论】:

  • 感谢您为此提供的所有帮助。
  • 接受答案会提高您的声誉(我应该承认,我的声誉)!
  • 感谢您对此提供的所有帮助,我终于有了一些工作!奇怪的是,直到我从 Reward 中去掉括号后它才起作用,所以 bysort Year Month Subject Trial Reward : gen todrop = Reward[1] == 2 & Reward[5] == 2 成功了。知道为什么会这样吗?从你所说的一切和我所读到的,这似乎不应该发生。
  • 奇怪的是您需要删除括号的断言,因为它们是解决方案的基本部分!如果您认为这是错误的,您不应该接受我的回答,但我不相信。该代码重现了您的示例中所要求的内容。括号的作用记录在对by: 的每一次严肃讨论中,从help 和手动输入开始。
【解决方案2】:
gen flag_temp=1 if attempt == 2 & reward == 2
bysort trial: egen flag=min(flag_temp)

drop if flag==1

轰隆隆

【讨论】:

  • 好吧,这很接近,但“红利回合”试验是随机的,并且对于不同的参与者来说并不相同。因此,对于参与者 A 和 C,奖金回合是试验 2,但对于参与者 B,奖金回合是试验 3- 所以我只希望 A 和 C 放弃试验 2,而 B 只放弃试验 3。此代码删除两个试验2 和试验 3 为所有三个参与者。
  • Amie:请举个数据例子。这对你来说都很清楚,但是要求人们在没有例子的情况下将所有规则都牢记在心是更难的。请参阅stackoverflow.com/help/mcve 了解如何提出好问题。
猜你喜欢
  • 2016-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多