Stata 使用求和创建新变量
我有如下数据:Stata 使用求和创建新变量,stata,Stata,我有如下数据: | Country | Year | Firm | Profit | |---------|------|------|--------| | A | 1 | 1 | 10 | | A | 1 | 2 | 20 | | A | 1 | 3 | 30 | | A | 1 | 4 | 40 | 我想为每个公司I创建一个新变量,用于计算以下各项: 例如,公
| Country | Year | Firm | Profit |
|---------|------|------|--------|
| A | 1 | 1 | 10 |
| A | 1 | 2 | 20 |
| A | 1 | 3 | 30 |
| A | 1 | 4 | 40 |
我想为每个公司I创建一个新变量,用于计算以下各项:
例如,公司1
的变量值为:
max(20 - 10, 0) + max(30 - 10, 0) + max(40 - 10, 0)
在Stata如何按国家和年份进行此操作?注意:这是发布的第一个答案。它并没有避免从字面上理解OP的代数并希望在组内实现最大值计算的陷阱。但我在发帖后意识到,一定有一种更简单的方法来做这件事,@Romalpa Akzo做到了,这非常好。我在请求时取消删除了它,因为它确实显示了一些在组上循环的机制,并使用自定义的Mata函数为每个组执行计算
在这里,我编写了一个Mata函数来返回组所需的结果,然后在组上循环以填充预定义的变量
为了测试包含多个组的数据集的代码,我使用Stata的auto
toy数据集中的mpg
mata :
void wanted (string scalar varname, string scalar usename, string scalar resultname) {
real scalar i
real colvector x, result, zero
result = x = st_data(., varname, usename)
zero = J(rows(x), 1, 0)
for(i = 1; i <= rows(x); i++) {
result[i] = sum(rowmax((x :- x[i], zero)))
}
st_store(., resultname, usename, result)
}
end
sysuse auto, clear
sort foreign rep78 mpg
egen group = group(foreign rep78), label
summarize group, meanonly
local G = r(max)
generate wanted = .
generate touse = 0
quietly forvalues g = 1 / `G' {
replace touse = group == `g'
mata : wanted("mpg", "touse", "wanted")
}
那么,这将如何应用于您的数据
clear
input str1 Country Year Firm Profit
A 1 1 10
A 1 2 20
A 1 3 30
A 1 4 40
end
egen group = group(Country Year), label
summarize group, meanonly
local G = r(max)
generate wanted = .
generate touse = 0
quietly forvalues g = 1/`G' {
replace touse = group == `g'
mata: wanted("Profit", "touse", "wanted")
}
结果:
. list Firm Profit wanted, sepby(group)
+------------------------+
| Firm Profit wanted |
|------------------------|
1. | 1 10 60 |
2. | 2 20 30 |
3. | 3 30 10 |
4. | 4 40 0 |
+------------------------+
注:这是发布的第一个答案。它并没有避免从字面上理解OP的代数并希望在组内实现最大值计算的陷阱。但我在发帖后意识到,一定有一种更简单的方法来做这件事,@Romalpa Akzo做到了,这非常好。我在请求时取消删除了它,因为它确实显示了一些在组上循环的机制,并使用自定义的Mata函数为每个组执行计算
在这里,我编写了一个Mata函数来返回组所需的结果,然后在组上循环以填充预定义的变量
为了测试包含多个组的数据集的代码,我使用Stata的auto
toy数据集中的mpg
mata :
void wanted (string scalar varname, string scalar usename, string scalar resultname) {
real scalar i
real colvector x, result, zero
result = x = st_data(., varname, usename)
zero = J(rows(x), 1, 0)
for(i = 1; i <= rows(x); i++) {
result[i] = sum(rowmax((x :- x[i], zero)))
}
st_store(., resultname, usename, result)
}
end
sysuse auto, clear
sort foreign rep78 mpg
egen group = group(foreign rep78), label
summarize group, meanonly
local G = r(max)
generate wanted = .
generate touse = 0
quietly forvalues g = 1 / `G' {
replace touse = group == `g'
mata : wanted("mpg", "touse", "wanted")
}
那么,这将如何应用于您的数据
clear
input str1 Country Year Firm Profit
A 1 1 10
A 1 2 20
A 1 3 30
A 1 4 40
end
egen group = group(Country Year), label
summarize group, meanonly
local G = r(max)
generate wanted = .
generate touse = 0
quietly forvalues g = 1/`G' {
replace touse = group == `g'
mata: wanted("Profit", "touse", "wanted")
}
结果:
. list Firm Profit wanted, sepby(group)
+------------------------+
| Firm Profit wanted |
|------------------------|
1. | 1 10 60 |
2. | 2 20 30 |
3. | 3 30 10 |
4. | 4 40 0 |
+------------------------+
下面是您问题的直接解决方案(注意使用
dataex
提供示例数据):
其背后的逻辑如下:
以下是您问题的直接解决方案(注意使用
dataex
提供示例数据):
其背后的逻辑如下:
哇,真整洁。为什么第二行要用括号?括号有意义,不是修饰性的。请看任何关于-by:-前缀的好解释。哇,太整洁了。为什么第二行要用括号?括号有意义,不是修饰性的。有关-by:-前缀的详细说明,请参见。