第五讲 数据的分组、合并与转换
本讲主要内容 5.1.数据合并的类型和原理 5.2.纵向合并(append)——增加样本量 5.3.横向合并(merge)——增加变量 5.4.数据的转换 5.5.数据的分组 5.6.数据的集合
5.1.数据合并的类型和原理
内容相似的独立调查:城乡;性别 不同层次、不同年份的调查 母亲的数据与子女的数据 低层数据的高层特征
为什么需要合并数据 一个内容相同或类似的调查分别在城、乡进行,或在男性 和女性间进行。数据也在不同地方由不同人员录入。若需 比较城乡之间、性别之间在某些方面的差异,最好的方法 之一就是将城乡样本合二为一,将男性和女性样本合二为 一 个体居住的社会环境可能影响他们的日常生活和行为。越 来越多的社会调查除了关注个体本身的差异外,也开始关 注他们的生存环境,包括家庭和社区背景等。家庭寓于社 区中,个人寓于家庭中。数据分析时,需要将分别录入的 数据合并成包括不同层次、不同内容的数据
数据合并的类型 增加观察值(即样本量):纵向合并 增加变量:横向合并 若有一个城市儿童数据和一个农村儿童数据,二者的内容基本相同 可进行独立分析或整合后作为整体样本的次样本分析 增加变量:横向合并 若有一个社区数据和一个家庭数据,家庭寓于社区中,若想将二者 合二为一,从而使家庭数据包含社区的基本特征,则需将数据进行 横向合并
数据合并的窗口路径
数据合并的几个主要概念 主要数据(Master dataset):指当前在Stata界面的数据, 又称当前数据(current dataset)、窗口数据或记忆空间数 据 使用数据(using dataset) :指当前不在Stata界面、但行 将被合并到当前数据的数据,也称辅助数据。该名词主要用 于数据的合并 关键变量(Key variables),也称标识符(identifiers)或 合并变量(match variables):横向合并的专有词汇,用来 合并两个数据的变量。该变量必须同时存在于主要数据和使 用数据中,且在使用前必须排序。主要变量可以是一个,也 可以是两个或多个
扩大记忆空间的容量 由于合并数据将增加当前数据的观察值或(和)变量,扩 大数据的占用空间,故在进行合并前,首先要确定是否有 足够的记忆空间允许数据的合并 否则,可能遇到错误提示 Caution! Merging and appending both add data to the data already in Stata's memory. It is easy to ask Stata to put more data in memory than you've allowed room for. Add together the sizes of all the files you want to merge or append before you combine them, clear and set memory if necessary, then combine the files. If not, you may get the message "No room to add more variables/observations."
5.2.纵向合并(append) ——增加样本量
原理 将保存在某个盘符中的stata数据文件的内容追加到当前 数据窗口的后面,生成一个新数据 在绝大部分的纵向合并中,用于两个数据库的格式和变量 基本类似,但观察值却未必一样 观察值可以是独立的,来自于同一调查的不同样本,也可 能不是完全独立的,来自于不同调查时间的相同样本 合并后,数据的变量基本不变,但观测个案增加了 该方法可以将两个或多个数据文件进行上下对接,简单明 了,不易出错
方法 窗口路径Data–Combine datasets–Append datasets (纵向合并数据的对话框)
命令 . append using [使用数据的路径和名称] 也可以只读入使用数据中的部分变量 ① ② ①:纵向合并数据的基本命令 ②:使用数据的路径和名称(目前记忆空间的数据是主要 数据) 也可以只读入使用数据中的部分变量 . append using [使用数据的路径和名称], keep[变量名] ① ①:在合并使用数据时,只保留keep后面指定的变量
几点说明(I) 使用纵向合并的场合 几点说明: 纵向追踪调查 内容相同的调查在不同地区由不同人群完成 无需排序数据,因为无需按照任何标识符(identifier)进行各并, 而只是将两个数据上下对接到一起 进行纵向合并时,Stata的log文件往往提示说,标签已经定义了。 可以忽略
几点说明(II) 不同数据中,内容相同的变量需要有同样的名称。故在合 并以前,分别描述数据: 若两个文件的变量相同、名称也相同,合并后,新文件的变量数应 该与合并前任何一个数据的变量数目一致 若每个文件都有一些独特的变量,但相同变量的名称是一样的,则 新文件的变量数应该多于合并前任何一个数据的变量数(keep) 若每个文件的变量数目相同、变量包含的内容也相同,但变量的名 称却不同,合并后,变量数目也会多出来,且需给内容相同、但名 称不同的变量更名
5.3.横向合并(merge) ——增加变量
场合 不同层次数据:母亲(或家庭或社区)与儿童数据 配对数据:妻子与丈夫、兄弟姊妹 纵向追踪调查:不同时期的调查数据 其它场合 母亲是儿童的母亲,家庭是儿童的家庭,社区是儿童居住的社区 不同层次数据合并;低层次数据寓于高层次数据中 配对数据:妻子与丈夫、兄弟姊妹 同层数据合并 纵向追踪调查:不同时期的调查数据 大部分不同时期的调查对象是相同的 可以是单层次、也可以是不同层次数据的合并,以调查的内容而 异 其它场合
原理 从一个数据库中提取一些变量到另一个数据库中,故横向 合并也就是变量的合并 将盘符文件的内容连接到当前数据编辑窗口的右边,形成新数据 新数据的变量增加,但观察个案可以不变 实际上是将两个数据文件,按照个案对应进行左右对接 实现数据文件的横向合并的前提是,主要数据和使用数据 必须有一个(或多个)相同的关键变量 横向合并中,除关键变量外,其它变量的名称都不能相同 若两个数据包含其它的同名变量,则使用数据中的变量数 值将被主要数据的同名变量数值取代
窗口路径 Data – Combine datasets – Merge two datasets (Merge multiple datasets) 对话框及其解释 One-to-one on key variables(利用关键变量进行一对 一的合并) One-to many on key variables (unique key for data in memory)(利用记忆空间的关键变量进行一对多的合 并) Many-to-one on key variables (unique key for data on disk)(利用使用数据的关键变量进行一对多的合并) One-to-one by observation(一对一观察值的合并)
选项对话框 Keep the following variables: (If not specified, all variables are kept) Specify name of new variable to mark result of merge: Do not copy value lable definition from file Do not copy notes from file Replace missing data in memory with data from file Replace nonmissing data in memory with data from file Drop observations in dataset on disk that do not match 第1、3、4项都与append命令下的选项相同;其它几项 是merge命令独特的选项
横向合并与纵向合并的异同 横向数据合并的基本命令是merge。利用该命令,将新变 量添加到当前数据中 与append 命令一样,在合并数据前,首先需要有足够的 记忆空间,承载新增加的内容 注意:横向数据合并中,主要数据和使用数据都必须按照 主要变量进行排序,否则合并无法进行,还会得到错误的 提示,纵向数据合并无需对哪个变量进行排序 横向数据合并需要关键变量,纵向数据合并无需关键变量 .append将两个变量类似、但观察个案不同的数据整合在 一起;.merge将具有不同变量的两个数据整合在一起
横向合并的第一步 先看使用数据: . use [文件路径名称] . sort [关键变量] . save [文件路径名称], replace 打开使用数据库 . sort [关键变量] 将关键变量进行排序,该变量是两个数据库共有的标识符 . save [文件路径名称], replace 保存并关闭已经按关键变量排序的使用数据库
横向合并的第二步 再看主要数据: . use [文件路径名称] . sort [关键变量] 打开主要数据库 . sort [关键变量] 对关键变量进行排序 . merge [关键变量] using [文件路径名称], keep [变量] 关键变量即为sort后面的变量;利用该变量匹配两个数据 文件名是盘符数据库的名字 keep选项
横向合并的基本选项 . merge [关键变量A 关键变量B ] using [文件路径和名 称] . merge [关键变量] using [文件路径和名称],update . merge [关键变量] using [文件路径和名称],update replace . merge [关键变量] using [文件路径和名称],nokeep unique, uniqmaster, uniqusing
系统变量 _merge 当Stata 合并文件时,软件自动生成系统变量_merge 该变量有3-5取值,因是否使用update 或replace 选 项而异 根据取值,可以了解合并的结果: 1 = 观察值仅来自于主要数据,使用数据没有匹配的数据 2 = 观察值仅来自于使用数据,主要数据没有匹配的数据 3 = 观察值来自主要数据和使用数据,且数值匹配 4 = 观察值来自主要数据和使用数据,且主要数据的缺失值得到 更新 5 = 观察值来自于主要数据和使用数据,但两个数据的数值不匹 配
一对一合并(one-to-one on key variables) . merge husbid using "I:\stata\hhwk_husb00.dta", unique
一对多合并(One-to-many on key variables) (1)使用数据分布情况
一对多合并(One-to-many on key variables) (2)主要数据分布情况
. merge mothid using “I:\stata\ru_merge.dta”,uniqmaster variable mothid does not uniquely identify observations in F:\stata\ru_merge.dta
多对一合并(Many-to-one on key variables)(unique key for data on disk) . merge mothid using "I:\stata\muqin_merge", uniqusing variable mothid does not uniquely identify observations in the master data
一对多 vs. 多对一
一对一观察值的合并(One-to-one by observation) . merge using data2
注意事项:同名变量 除标识符外,两个数据中的变量名称不能相同;否则,使用 数据变量的数值将被主要数据中同名变量的数值所取代。这 样既达不到增加变量的目的,还会混乱数据 在行将合并的数据中,同样的变量内容需要有不同的名称 熟悉、了解主要数据和使用数据。若有重名变量,则新生成 的数据变量比两个数据加起来的变量少(除关键变量外)
注意事项:合并后的变量数目 数据合并后,新数据的变量必须增加。新数据具体有多少 变量 因两个原始数据中变量的数目而异 也因合并数据过程中读入的变量数目而异 但合并后的数据无疑会比主要数据和使用数据有更多变量 若主要数据和使用数据各有5个变量,在合并数据的过程 中,也没有限定读入的变量,且只有一个关键变量,则新 数据将有9个变量(=5+5-1)
注意事项:合并后的样本量 在一对一的配对合并中,合并后的数据样本量 若使用数据中的观察值与主要数据不完全匹配的话,则 会出现多余的样本量 因原始数据样本量的多寡而异 也因合并方式而异 但通常不会少于主要数据的样本量 若使用数据中的观察值与主要数据不完全匹配的话,则 会出现多余的样本量
注意事项:_merge变量 在合并数据的过程中,系统自动生成_merge变量 当合并完成后,可删除_merge变量 在新一轮的合并中,Stata又会产生一个_merge变量 若原先的_merge变量没有删除的话,则Stata拒绝执行新的合 并命令,且输出一个错误的提示,提示_merge已经存在
注意事项:unique,uniqmaster,uniqusing选项 variable mothid does not uniquely identify observations in the using data r(459); (mothid在使用数据中不是独一无二的) 一对多的合并可以使用uniqmaster 选项;多对一的合并可 以使用uniqusing选项。即便不使用选项,也会得到以下提 示: variable mothid does not uniquely identify observations in the master data
注意事项:样本的取舍 . keep if _merge==3 或 . drop if _merge ==1 | _merge ==2 (N observations deleted) 这样实际上是去掉了两个原始数据中不匹配的观察值。 剩余的观察值就是在两个文件中都有的
注意事项:重复值(I) 合并后的数据是否有重复的观察值?(注意:若一个高 层数据与低层数据合并——如儿童数据与母亲数据合 并——则对兄弟姊妹来说,母亲的ID一定是重复的。) 查找重复值的方法: 方法一:使用list …… [_n-1]命令 . sort kidid. list kidid if kidid ==kidid[_n-1] 若有输出结果,则有重复值;否则无 注意,若某个变量有一个以上的缺失值,则从第二个缺失值 开始,它们被当作是重复的
注意事项:重复值(II) 方法二:使用assert命令 . bysort kidid: assert _N==1 按照kidid 的分组,检查_N==1的命题正确与否 对于每个kidid,必须有一个、且只能有一个观察值 1 contradiction in 15 by-groups assertion is false r(9); (在15个by分类中,有一个与上面的命题不符) (命题不正确)
注意事项:重复值(III) 方法三:使用duplicates report命令 提供一个表格,描述观察值出现的次数,是否有重复值 . duplicates report kidid Duplicates in terms of kidid --------------------------------- copies | observations surplus --------+------------------------- 1 | 14 0 2 | 2 1 ---------------------------------- 14个数据(surplus等于0);一个数值出现两次
注意事项:重复值(IV) 方法四:使用isid命令,检查关键变量是否独一无二地区分 每个观察值 . isid kidid variable kidid should never be missing r(459); (变量kidid永远不应该是缺失的) 这是一个错误提示。当该变量不缺失、但数据中存在重复观 察值时,得到的将是: variable id does not uniquely identify the observations r(459); 相反,若没有重复观察值,则该命令不会有任何输出结果
注意事项:重复值(V) 方法五:使用tab命令 . tab kidid,m 该方法如同list一样,当数据的观察值不多时,很好使用, 但若观察值太多,则是耗时耗力的,即便不是毫无结果的
两个或多个关键变量的合并 一个标识符通常就可代表一个观察值,但有时需要两个甚至多个标识 符才能代表一个观察值。比如,有一个不同社区的个体数据。于是, 有一个独一无二的社区标识符(commid),还有一个个体的身份标 识符(personid);个体标识符在不同社区可能是同样的。在这种 场合,使用commid和personid一起表示独一无二的个体观察值 合并数据时需要同时使用这两个关键变量,且使用数据和主要数据都 必须按照两个关键变量进行排序。此外,sort后面变量的顺序与 merge后面变量的顺序应该是一样的: . sort commid personid . merge commid personid using [使用数据的路径和名称] 检查commid与personid一起,是否表示同一个观察值: . by commid personid: assert _N==1
多个数据的合并(I) 从第8版开始,Stata一次可以合并两个或多个数据 假如有四个数据:ds1,ds2,ds3,ds4。其基本步骤: 数据1 (主要数据) . use ds1 . sort id . save ds1, replace 数据2: . use ds2 . save ds2, replace 数据3: . use ds3 . sort id . save ds3, replace 数据4: . use ds4 . save ds4, replace
多个数据的合并(II) 回到主数据(数据1): . use ds1 . sort id . merge id using ds2 ds3 ds4 . tabulate _merge . list id _merge* merge*中的*符号表示,列出所有_merge变量的频数分布 这是因为,在合并多个数据时,Stata自动生成一组描述性变量。这 组变量都以_merge命名,分别称为_merge1,_merge2,_merge3 等。它们分别与第一个using数据、第二个using数据、第三个using 数据相关 mergek==0:相应的使用数据没有的观察值 mergek==1:相应的使用数据拥有的观察值
5.4.数据的转换
社会科学多以人为研究对象。由于个体寓于家庭等群体中, 也由于群体环境对个体行为有着深刻影响,故大部分的社 会调查收集家庭成员资料 两种录入格式;两类不同的数据结构: 宽数据(wide format) 长数据(long format) 相异的录入方式不会使数据的内容产生任何差异,但对不 同结构的数据而言,研究对象和内容、分析单位是不同的 纵向调查数据来自的不同的年份。当将每期调查数据整合 在一起的时候,其结构同样可以表现为长格式或宽格式 出于研究的需要,常常对原有的数据结构进行转换
宽数据(wide format)结构(I) 第一列:变量HHID(即家庭户的标识符;对每个家庭来说,它是独 一无二的);四个家庭户,分别称为1001,1002,1003,1004 第二列—第五列:变量age01-age04(家庭第一到第四个成员的年 龄) 每个家庭成员的数量不尽相同:1-4;取值的缺失 在这样的数据格式中,即便一个家庭有10个成员,也只有一个观察 值(或样本);同样,如果一个家庭仅有一个成员,它也有一个观察 值 多变量数据
长数据(long format)结构 一个家庭有多个观察值。 具体观察值的个数因被调 查的家庭成员的多寡而异 比如,若一个家庭有10个 成员,则该家庭有10个观 察值;若一个家庭只有一 个成员,则该家庭仅有一 个观察值 多观察值数据
长、宽数据比较 记录同样的内容,仅表现形式不同 可相互转换 转换数据结构是出于研究的需要 当研究问题是家庭、分析单位也是家庭时,数据结构必须是以家庭为 单位的宽格式,每个家庭有一个、且只能有一个观察值 若研究问题是儿童、分析单位也是儿童时,数据的结构必须是以儿童 为单位的长格式。每个儿童有一个独立的观察值,但同一个家庭可能 有多个观察值
数据转换的菜单窗口 Stata的数据转换的菜单路径和窗口: Data – Create or change variables – Other variable transformation commands – Convert data between wide and long 对话框:四种数据的转换方式: (1)从宽数据到长数据 (2)从长数据到宽数据 (3)回到长数据 (4)回到宽数据 命令reshape需要以下资料才能运行:变量i;变量j,变量x_ij
从长到宽的基本命令 . reshape wide [转换的变量], i[观察值的标识符] j[次标识符] ① ② ③ ④ ①:将长数据转换为宽数据的命令 ②:一组变量的共同前缀,即x_ij的x,指定希望转换的变量名称。在前 面提到的家庭户数据中,需要转换的变量为age ③:选项i及括号内的变量一起,指定观察值的标识符,或取值独一无二、 代表每个逻辑观察值的变量。在家庭户数据中,每个家庭构成一个 逻辑观察值 ④: 选项j及括号内的变量一起,指定观察值的次标识符,或在每个逻辑 观察值中,其独一无二的取值代表每个次观察的变量。在家庭户数 据中,次观察即每个家庭中的个体。它也告诉Stata,在生成新变量 的时候,使用哪个原有变量的取值
从宽到长的基本命令 . reshape long [变量名称], i[观察值的标识符] j[次标识符] ① ② ③ ④ ① ② ③ ④ ①:将宽数据转换为长数据的命令 ②:根据次标识符指定的、有共同主干、但不同尾缀的一组 变量,生成一个新变量 ③:同前 ④:变量j代表次标识符,在数据中已经存在,是生成新变量 的依据 没有在reshape命令中指定的变量对同一个i变量的取值 而言,其取值也必须是同样的(相当于对话框中的Note: All other variables should be constant within ID)
使用的数据:"E:\stata\Chapter5_reshape.dta" 5.4.2.将长数据转换成宽数据 使用的数据:"E:\stata\Chapter5_reshape.dta"
熟悉数据的基本情况与结构 obs: 2,108 vars: 6 22 Nov 2006 16:58 Contains data from I:\stata\child04_reshape.dta obs: 2,108 vars: 6 22 Nov 2006 16:58 size: 65,072 (93.8% of memory free) --------------------------------------------------------------------------- storage display value variable name type format label variable label age byte %8.0g age in 2004 girl byte %8.0g girl in 2004, 0=boy-1=girl kidid double %13.0g children id in 2004 mothid double %13.0g mother id in 2004 order float %9.0g yob int %8.0g year of birth in 2004 Sorted by: kidid
数据共有2108个观察值,6个变量: 母亲的标识符(mothid) 儿童的标识符(kidid) 儿童的年龄(age) 性别(girl) 胎次(order) yob(出生年)
数据的结构 儿童数据。每个儿童都有一个独立的观察值和独一无二的 标识符;相反,母亲的标识符却是可以重复的,出现的频 次因孩子的多寡而异 那么,样本中一共有多少位母亲? 每位母亲最多有几个孩子在样本中? 有助于判断数据转换结果是否正确 如何获得这两方面的信息
. list in 2090/2099 +-------------------------------------------------------+ | mothid kidid age yob girl order | |-------------------------------------------------------| 2090. | 52240301781 52240301782 0 2004 0 1 | 2091. | 52240306202 52240306281 3 2001 0 1 | 2092. | 52240308102 52240308103 8 1996 0 1 | 2093. | 52240308102 52240308104 3 2001 0 2 | 2094. | 52240400502 52240400506 17 1987 0 1 | 2095. | 52240401302 52240401307 15 1988 1 1 | 2096. | 52240401581 52240401582 0 2003 0 1 | 2097. | 52240404102 52240404103 9 1995 0 3 | 2098. | 52240404102 52240404104 7 1997 1 2 | 2099. | 52240404102 52240404161 4 2000 1 1 |
第一个问题:母亲的数量 . sort mothid . by mothid: keep if _n==1 (424 observations deleted) 按母亲的身份号码分群(by mothid) 保留每位母亲的第一个观察值(if _n==1) 424个观察值被删除。故数据共有1684位母亲(2108- 424)
第二个问题:母亲的子女数 . by mothid: gen ceb=_N . tab ceb ceb | Freq. Percent Cum. ----+----------------------------------- 1 | 1,303 61.81 61.81 2 | 690 32.73 94.54 3 | 96 4.55 99.10 4 | 8 0.38 99.48 5 | 5 0.24 99.72 6 | 6 0.28 100.00 Total | 2,108 100.00 . by mothid: gen ceb=_N 按mothid的分类, 生成一个名为ceb 的变量,即母亲 的总生育数量 变量的取值依赖 于mothid出现的 总次数,由_N表 示
从长数据到宽数据(I) . reshape wide kidid age girl yob, i(mothid) j(order) ① ② ③ ④ (note: j = 1 2 3 4 5 6) ① :reshape wide命令告诉Stata,将长数据格式转换 成宽数据格式 ②:命令参数后面的变量kidid,age,girl即是需要转 换的变量 ③ :i(mothid) 告诉Stata,以mothid为标准进行转换。 命令reshape需要一个共同的标识符(ID),利用 该标识符将每个孩子指定给他的母亲;将兄弟姊妹 指定给同一母亲
从长数据到宽数据(II) . reshape wide kidid age girl yob, i(mothid) j(order) ① ② ③ ④ (note: j = 1 2 3 4 5 6) ④:在从长数据转换为宽数据的过程中,需要另一个标识符,表明 转换后变量尾缀的取值,也就是给每个新的母亲层次的变量指 定一个相应的尾缀 本例中,它是由j()来表示的。该命令告诉Stata ,按照order 的数值给变量kidid, age,girl指定尾缀 假若一位母亲有六个孩子,孩子的顺序(order)为1,2,3, 4,5,6,则在宽数据中,age将会变成age1,age2,…… age6。变量后面的尾缀代表每个孩子与兄弟姊妹之间的长幼 顺序关系。变量j自动消失,变成了其它变量的后缀
N(by mothid: keep if _n==1);为什么 变量数目;kidid1-kidid6,age1-age6,girl1-girl6;变量order自动消失;缺失 合并后数据的基本情况(describe)、分布(list)
从长到宽:转换后的数据结构特点 观察值减少;变量增加 虽然变量增加,但变量名称的主干不变,age还是叫age, girl还是叫girl,kidid还是叫kidid 不同的是,在原变量的后面,都增加了1-6的数字尾缀。 尾缀1表示第一个孩子,尾缀2表示第二个孩子,以此类 推 尾缀的取值取决于代表孩子长幼序列的变量j(order); 该变量在生成宽格式数据的过程中消失了,取而代之的是 新变量的后缀
两类常见的错误 1. 缺失值错误 标识符变量不能有缺失值。否则,Stata将停止工作,并 显示错误。如:当变量j有缺失时: 非常数错误 1. 缺失值错误 标识符变量不能有缺失值。否则,Stata将停止工作,并 显示错误。如:当变量j有缺失时: order contains missing values r(498); (变量order有缺失值) 非常数错误 Stata按照指明的变量进行转换,并假定数据中其它变量 在同一组群中仅有一个取值,即常数。当该假定不成立时, 软件也会停止工作,并输出错误提示 . reshape wide kidid age girl, i(mothid) j(order)
5.4.3. 从宽数据到长数据
从宽数据到长数据(I) . reshape long kidid age girl yob, i(mothid) j(order) ① ② ③ ④ (note: j = 1 2 3 4 5 6) ①:将数据从宽格式转换为长格式的命令参数 ②:变量kidid, age, girl,yob都是横向数据变量名的 主干部分,其后都有1-6的后缀。后缀相当于每个 孩子的胎次,第一个孩子的年龄为age1,如此类 推;后缀也是每个孩子长幼次序的标识符。若数据 中的变量不是主干+数字的格式,最好是先重新定 义变量,将其转换为这类格式 ③:按照mothid给每个孩子分组
从宽数据到长数据(II) . reshape long kidid age girl yob, i(mothid) j(order) ① ② ③ ④ (note: j = 1 2 3 4 5 6) ④ :j(order)告诉Stata,按照reshape long后面变量的后缀,生 成名为order的新变量 变量j有6个取值[(note: j = 1 2 3 4 5 6)]。若原变量的后缀是1, 则order的取值为1,……,以此类推 变量order代表每个孩子与兄弟姊妹的长幼关系,变量名称是任 意的 这与reshape wide不同,因为在reshape wide命令中,我们必 须使用现存的、实际上的确标识母亲每个孩子顺序的标识符 现将刚刚转变为宽格式的数据转变回来
从宽到长:命令输出结果 从原来的1684个观察值变成了10104个观察值;从原来的25个变量 减少到6个变量;生成名为order的新变量 Data wide -> long ------------------------------------------------------ Number of obs. 1684 -> 10104 Number of variables 25 -> 6 j variable (6 values) -> order xij variables: kidid1 kidid2 ... kidid6 -> kidid age1 age2 ... age6 -> age girl1 girl2 ... girl6 -> girl yob1 yob2 ... yob6 -> yob 从原来的1684个观察值变成了10104个观察值;从原来的25个变量 减少到6个变量;生成名为order的新变量 原来的xij变量都失去了尾缀,变成了kidid,age,girl,yob
从宽到长:数据基本特征(I) Contains data obs: 10,104 vars: 6 size: 252,600 (75.9% of memory free) ---------------------------------------------------------------- storage display value variable name type format label variable label mothid double %13.0g mother id in 2004 order byte %9.0g age byte %8.0g girl byte %8.0g kidid double %13.0g yob int %8.0g ----------------------------------------------------------------- Sorted by: mothid order Note: dataset has changed since last saved
从宽到长:数据基本特征(II) 在数据转换的过程中,经过转换的变量的标签都丢失了 更为重要的是,宽数据只有1684个观察值,而长数据却 出现了10104个观察值。为什么? 在宽数据中,一个母亲最多有6个孩子。于是,Stata假定, 每个母亲都有6个孩子;reshape long命令以6为基准, 给每组mothid各生成6个观察值,代表6个孩子,无论孩 子是否存在。因此,新数据的观察值 = 1684 x 6(即 10104) 然而,事实上,并不是每个母亲都有六个孩子,大部分母 亲只有一个或两个孩子,所以,对绝大部分观察值来说, 孩子的数据都是缺失的:
. list +-------------------------------------------------------+ | mothid order age girl kidid yob | |-------------------------------------------------------| 10093. | 52240404102 1 9 0 52240404103 1995 | 10094. | 52240404102 2 7 1 52240404104 1997 | 10095. | 52240404102 3 4 1 52240404161 2000 | 10096. | 52240404102 4 . . . . | 10097. | 52240404102 5 . . . . | 10098. | 52240404102 6 . . . . | 10099. | 52240404202 1 16 0 52240404203 1988 | 10100. | 52240404202 2 12 0 52240404204 1992 | 10101. | 52240404202 3 . . . . | 10102. | 52240404202 4 . . . . | 10103. | 52240404202 5 . . . . | 10104. | 52240404202 6 . . . . |
从宽到长:保留有效数据 由此可见,每位母亲都有6个观察值,但并不是每位母亲 都有六个孩子。母亲52240404102有三个孩子;母亲 52240404202有两个孩子 当孩子缺失的时候,所谓孩子的数据当然也就是无效的。 于是,需要剔除无效样本: . keep if kidid!=. 或 . drop if kidid==. (7996 observations deleted) (只保存kidid 为有效值的样本;共有7996观察值被删 除)
从宽到长的常见问题 宽数据变量的尾缀不能以0开头的。虽然Stata依旧工作, 但其结果却是有问题的
Data wide -> long ---------------------------------------------------- Number of obs. 4 -> 16 Number of variables 5 -> 7 j variable (4 values) -> pid xij variables: age1 age2 ... age4 -> age 正确的情况是,在新数据中,变量的数目应该是3个: hhid,pid,age。为什么是5个呢
从宽到长:常见问题的原因与解决方法 原因:原始数据age变量的尾缀以0开头 解决方法: 由于j变量的默认排序从1开始,故在生成变量age时,Stata寻找 尾缀为1,2,3,4的变量 然而,在原数据中,age的尾缀分别为01,02,03,04,Stata 找不到相应的数据 故reshape long命令的输出结果提醒说,age1-age4 not found 解决方法: 事前预防:在数据转换前,将原数据age变量的尾缀替换为1,2, 3,4。这是比较省事的方式 事后弥补:在数据转换后,使用replace命令,替换age的缺失 值,然后再删除变量age01-age04
5.5. 数据的分组(group)
为什么对数据进行分组 社会科学研究经常分析比较不同人群的特征及其差异,产 生差异的原因,以及这些特征对社会行为和结果的影响 有人希望探讨地区或城乡之间经济发展的异同 有人分析男性和女性收入的差异 还有人探究不同年龄的妇女对儿子和女儿的看法 研究者还希望分析种种因素对不同人群行为影响的异同 在这种情况下,我们往往根据研究问题的需要,区分群体 (城乡、地区、性别、年龄等)的组群,并进行比较分析。 由于该分组是在系统内定义的,在数据管理器中并不易明 确体现
. by urban girl region: sum x y z . sort urban girl region age . by urban: sum x y z 按城乡计算变量x y z的统计量 . sort urban girl . by urban girl: sum x y z 按城乡和性别计算变量x y z的统计量 . sort urban girl region . by urban girl region: sum x y z 按城乡、性别和地区计算变量x y z的统计量 . sort urban girl region age . by urban girl region age: sum x y z 按城乡、性别、地区和年龄计算变量x y z的统计量 . by urban: regress y x1 x2 x3 按城乡进行回归分析
5.6. 数据的集合 (Collapse 和 Contract)
数据的集合 命令collapse和contract对记忆空间的数据进行集合,生 成一个新的高层次数据 前者用于生成均值、中位数等统计量的数据 后者用于生成频数或比例的数据 特别需要注意的是,新生成的数据将会取代记忆空间的数 据。因此,若不想取代原数据的话,则在执行该命令之后, 应该使用save as的命令 集合数据的窗口
窗口与路径 集合频数或比例的路径: Data – Create or change variables – Other variable transformation commands – Make dataset of frequencies(contract) 集合统计量的路径 Data – Create or change variables – Other variable transformation commands – Make dataset of means, medians, etc(collapse)
统计量的选择;多种统计量;分组