生成一个变量,该变量是另一个变量的两个值的比率
Generating a variable that is the ratio of two values of another variable
我有一个个人级别的横截面数据集。观察是属于一个家庭的个人,而这个家庭又是一个家庭的一部分。一个家庭可以有一个或多个家庭。
我的目标是通过将男人的家务劳动时间除以伴侣的家务劳动时间来获得每周家务劳动时间的性别比例。
当个人是家庭的主要成员(女性)时,变量 v31
为 1,当个人是丈夫时,变量 v31
为 2。
变量v4
是家庭ID。
变量v32
是户内家庭的递增编号,第一户为1,第二户为2,以此类推。
代码示例:
clear
input obs v4 v32 v31 v850
1 1 1 1 27
2 1 1 2 12
3 2 1 2 8
4 2 1 1 41
5 3 1 2 0
6 4 1 1 29
7 4 1 2 11
8 4 2 1 37
9 4 2 2 1
end
list
通过查看上面的数据示例,我的目标是拥有一个名为 domwork_ratio
的新变量,例如,对于第 1 行和第 2 行,男性伴侣的家务劳动时间比率和女性伴侣,即 12/27。这两个观察值将具有相同的值,因为它们属于同一个家庭 v32
和同一个家庭 v4
。
我不知道如何告诉 Stata 做比率,以便每个丈夫的家务劳动时间除以他伴侣的家务劳动时间。
我试过使用命令:
bysort v4 v32 v16: gen domwork_ratio = cond(v4 != v4[_n-1],999999,v850_tot[_n-1]/v850_tot)
但由于某些原因,创建的变量只有 999999 作为唯一值。
感谢您提供数据示例。
clear
input obs v4 v32 v31 v850
1 1 1 1 27
2 1 1 2 12
3 2 1 2 8
4 2 1 1 41
5 3 1 2 0
6 4 1 1 29
7 4 1 2 11
8 4 2 1 37
9 4 2 2 1
end
bysort v32 v4 (v31) : gen ratio = v850[2] / v850[1] if v31[1] == 1 & v31[2] == 2
list, sepby(v32 v4)
+----------------------------------------+
| obs v4 v32 v31 v850 ratio |
|----------------------------------------|
1. | 1 1 1 1 27 .4444444 |
2. | 2 1 1 2 12 .4444444 |
|----------------------------------------|
3. | 4 2 1 1 41 .1951219 |
4. | 3 2 1 2 8 .1951219 |
|----------------------------------------|
5. | 5 3 1 2 0 . |
|----------------------------------------|
6. | 6 4 1 1 29 .3793103 |
7. | 7 4 1 2 11 .3793103 |
|----------------------------------------|
8. | 8 4 2 1 37 .027027 |
9. | 9 4 2 2 1 .027027 |
+----------------------------------------+
失败的代码引用了一个您没有在问题中解释的变量v16
。但它的失败是可以解释的。该框架包括 by v4 v16:
并且在如此定义的组内 v4
和 v16
是不变的。那么这样的组由单个观察值组成。对于每个组中的第一个也是唯一一个观察结果,确实 v4
不等于 v4[_n-1]
,因为 v4[0]
返回为缺失。因此,如报告的那样,总是返回 999999。 (就 Stata 编程风格而言,返回系统缺失会是一个更好的主意。)
作为另一种可能的解决方案,我被建议使用以下代码:
by v4 v32 (v31), sort: assert _N <= 2
by v4 v32 (v31): gen domworkratio = v850_tot[2]/v850_tot[1]
它应该与 Nick 建议的代码具有相同的结果,我将其张贴在这里只是为了提供另一种可能性。
我有一个个人级别的横截面数据集。观察是属于一个家庭的个人,而这个家庭又是一个家庭的一部分。一个家庭可以有一个或多个家庭。
我的目标是通过将男人的家务劳动时间除以伴侣的家务劳动时间来获得每周家务劳动时间的性别比例。
当个人是家庭的主要成员(女性)时,变量 v31
为 1,当个人是丈夫时,变量 v31
为 2。
变量v4
是家庭ID。
变量v32
是户内家庭的递增编号,第一户为1,第二户为2,以此类推。
代码示例:
clear
input obs v4 v32 v31 v850
1 1 1 1 27
2 1 1 2 12
3 2 1 2 8
4 2 1 1 41
5 3 1 2 0
6 4 1 1 29
7 4 1 2 11
8 4 2 1 37
9 4 2 2 1
end
list
通过查看上面的数据示例,我的目标是拥有一个名为 domwork_ratio
的新变量,例如,对于第 1 行和第 2 行,男性伴侣的家务劳动时间比率和女性伴侣,即 12/27。这两个观察值将具有相同的值,因为它们属于同一个家庭 v32
和同一个家庭 v4
。
我不知道如何告诉 Stata 做比率,以便每个丈夫的家务劳动时间除以他伴侣的家务劳动时间。
我试过使用命令:
bysort v4 v32 v16: gen domwork_ratio = cond(v4 != v4[_n-1],999999,v850_tot[_n-1]/v850_tot)
但由于某些原因,创建的变量只有 999999 作为唯一值。
感谢您提供数据示例。
clear
input obs v4 v32 v31 v850
1 1 1 1 27
2 1 1 2 12
3 2 1 2 8
4 2 1 1 41
5 3 1 2 0
6 4 1 1 29
7 4 1 2 11
8 4 2 1 37
9 4 2 2 1
end
bysort v32 v4 (v31) : gen ratio = v850[2] / v850[1] if v31[1] == 1 & v31[2] == 2
list, sepby(v32 v4)
+----------------------------------------+
| obs v4 v32 v31 v850 ratio |
|----------------------------------------|
1. | 1 1 1 1 27 .4444444 |
2. | 2 1 1 2 12 .4444444 |
|----------------------------------------|
3. | 4 2 1 1 41 .1951219 |
4. | 3 2 1 2 8 .1951219 |
|----------------------------------------|
5. | 5 3 1 2 0 . |
|----------------------------------------|
6. | 6 4 1 1 29 .3793103 |
7. | 7 4 1 2 11 .3793103 |
|----------------------------------------|
8. | 8 4 2 1 37 .027027 |
9. | 9 4 2 2 1 .027027 |
+----------------------------------------+
失败的代码引用了一个您没有在问题中解释的变量v16
。但它的失败是可以解释的。该框架包括 by v4 v16:
并且在如此定义的组内 v4
和 v16
是不变的。那么这样的组由单个观察值组成。对于每个组中的第一个也是唯一一个观察结果,确实 v4
不等于 v4[_n-1]
,因为 v4[0]
返回为缺失。因此,如报告的那样,总是返回 999999。 (就 Stata 编程风格而言,返回系统缺失会是一个更好的主意。)
作为另一种可能的解决方案,我被建议使用以下代码:
by v4 v32 (v31), sort: assert _N <= 2
by v4 v32 (v31): gen domworkratio = v850_tot[2]/v850_tot[1]
它应该与 Nick 建议的代码具有相同的结果,我将其张贴在这里只是为了提供另一种可能性。