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:-前缀的详细说明,请参见。