Stata2R:那些 R 中的 _N 和 _n 替代技巧

文摘   2024-11-05 22:00   中国  

👇 连享会 · 推文导航 | www.lianxh.cn

🍓 课程推荐:2024 机器学习与因果推断专题
主讲老师:司继春 (上海对外经贸大学) ;张宏亮(浙江大学)
课程时间:2024 年 11 月 9-10 日 ;16-17日
课程咨询:王老师 18903405450(微信)

课程特色 · 2024机器学习与因果推断

  • 懂原理、会应用。本次课程邀请了两位老师合作讲授,目的在于最大限度地实现理论与应用的有机结合。为期四天的课程,分成两个部分:第一部分讲解常用的机器学习算法和适用条件,以及文本分析和大语言模型;第二部分通过精讲 4-6 篇发表于 Top 期刊的论文,帮助大家理解各类机器学习算法的应用场景,以及它们与传统因果推断方法的巧妙结合。
  • 以 Top 期刊论文为范例。目前多数人的困惑是不清楚如何将传统因果推断方法与机器学习结合起来。事实上,即便是 MIT 和 Harvard 的大牛们也都在「摸着石头过河」。为此,通过论文精讲和复现来学习这部分内容或许是目前最有效的方式了。张宏亮老师此前在浙江大学按照这一模式教授了「因果推断和机器学习」课程,效果甚佳:学生们能够逐渐建立起研究设计的理念,并在构造识别策略时适当地嵌入机器学习方法。

温馨提示: 文中链接在微信中无法生效。请点击底部「阅读原文」。或直接长按/扫描如下二维码,直达原文:

作者: 连玉君 (中山大学)
邮箱: arlionn@163.com

1.  简介

在 Stata 中,_N_n 能够帮助用户轻松获取数据集的总行数或当前行号,在进行分组统计分析、产生滞后项、差分项等数据分析任务中,是非常重要的工具。R 虽然没有完全相同的内置变量,但我们可以通过 dplyr 包的功能来模拟 _N_n。本文将通过示例展示如何在 R 中进行类似的操作,包括滞后变量、前向变量、分组统计、滚动窗口计算等。

本文旨在为那些已有 Stata 基础,又想学学 R 语言的用户提供一些实现 _N_n 功能的替代方案。

2.  Stata 中的 _n_N

在此前的推文 Stata编程:_n 和 _N 有啥区别? 中,我们详细介绍了 Stata 中的 _n_N。这里作简要回顾:

  • _n:表示当前观测的行号,常用于排序、筛选当前行数据等。
  • _N:表示当前数据集的总行数,适合用于计算总观测数或标记数据范围。

Stata 使用示例

sysuse auto 数据集上,可以通过 _n_N 进行如下操作:

sysuse auto, clear

// 1. 标记前 10 行数据
gen first_10 = (_n <= 10)

// 2. 计算总数,并在最后一行显示
gen total = (price == price[_N])

// 3. 创建滞后变量和差分
sort make
gen lag_price = price[_n-1]
gen diff_price = price - price[_n-1]

// 4. 分组统计每个行业的总人数
bysort industry: gen count_ind = _N

3.  R 中的实现示例

3.1 R 中的总观测数:模拟 _N

在 R 中,可以用 nrow()dplyr 中的 n() 来获取数据框的总行数,类似于 _N

df <- data.frame(x = c(12345))
n_total <- nrow(df)
print(n_total)

对应的 Stata 实现:

sysuse auto, clear
di _N // 打印总行数

3.2 R 中的行号:模拟 _n

可以用 row_number() 在 R 中生成行号,模拟 _n 的效果:

library(dplyr)
df <- df %>% mutate(n = row_number())
print(df)

对应的 Stata 实现:

sysuse auto, clear
gen n = _n
list make n if n <= 10 // 列出前 10 行及其行号

3.3 滞后变量、前向变量和差分

在 R 中,使用 dplyr::lag()dplyr::lead() 函数实现滞后和前向变量,并结合 mutate() 生成差分:

df <- data.frame(id = 1:10, value = c(10151825273240505860))
df <- df %>%
  mutate(
    lag_value = lag(value),            
    lead_value = lead(value),          
    diff_value = value - lag(value)    
  )
print(df)

对应的 Stata 实现代码:

sysuse auto, clear
sort make
gen lag_value = price[_n-1]
gen lead_value = price[_n+1]
gen diff_value = price - price[_n-1]

3.4 分组统计:模拟 Stata 中的 bysort

在 R 中,可以使用 group_by() 结合 mutate() 模拟 Stata 的 bysort。例如,统计每个行业的总人数:

df <- data.frame(industry = c("A""A""B""B""B""C"), value = 1:6)
df <- df %>%
  group_by(industry) %>%
  mutate(count_ind = n()) %>%
  ungroup()
print(df)

输出结果:

# A tibble: 6 x 3
    industry value count_ind
    <chr>    <int>     <int>
1   A            1         2
2   A            2         2
3   B            3         3
4   B            4         3
5   B            5         3
6   C            6         1

对应的 Stata 实现:

sysuse auto, clear
bysort industry: gen count_ind = _N

4.  R 中的高级用法

4.1 滚动平均

使用 zoo 包中的 rollmean() 可以方便地实现滚动窗口操作,例如计算移动平均:

library(zoo)

df <- data.frame(value = c(1020304050))
df <- df %>%
  mutate(roll_mean_3 = rollmean(value, 3, fill = NA, align = "right"))
print(df)

输出结果:

  value roll_mean_3
1    10          NA
2    20          NA
3    30          20
4    40          30
5    50          40

4.2 排名和分位数计算

通过 dplyr 中的 min_rank()ntile() 可以生成组内排名和分位数:

df <- data.frame(group = rep(1:2, each = 5), value = c(515102520818122230))
df <- df %>%
  group_by(group) %>%
  mutate(
    rank = min_rank(value),          # 组内排名
    quantile = ntile(value, 4)       # 组内四分位数
  ) %>%
  ungroup()
print(df)

输出结果:

# A tibble: 10 x 4
     group value  rank quantile
     <dbl> <dbl> <int>    <int>
 1       1     5     1        1
 2       1    15     3        2
 3       1    10     2        1
 4       1    25     5        4
 5       1    20     4        3
 6       2     8     1        1
 7       2    18     3        2
 8       2    12     2        1
 9       2    22     4        3
10       2    30     5        4

对应的 Stata 实现:

sysuse auto, clear
bysort group: gen rank = _n
bysort group (value): gen quantile = ceil(4 * _n / _N) // 生成分位数

4.3 组间差异的计算

在分组计算后,可以通过 left_join() 将组均值合并到原数据集,并计算观测值与组均值的差异:

df <- data.frame(group = rep(1:2, each = 5), value = c(515102520818122230))

group_means <- df %>%
  group_by(group) %>%
  summarize(mean_value = mean(value))

df <- df %>%
  left_join(group_means, by = "group") %>%
  mutate(diff_from_mean = value - mean_value)
print(df)

输出结果:

# A tibble: 10 x 5
   group value mean_value diff_from_mean
   <dbl> <dbl>      <dbl>          <dbl>
 1     1     5         15           -10
 2     1    15         15             0
 3     1    10         15            -5
 4     1    25         15            10
 5     1    20         15             5
 6     2     8         18           -10
 7     2    18         18             0
 8     2    12         18            -6
 9     2    22         18             4
10     2    30         18            12

对应的 Stata 实现:

sysuse auto, clear
bysort group: egen mean_value = mean(value)
gen diff_from_mean = value - mean_value

5.  总结

本文介绍了 R 如何通过 dplyr 包实现类似 Stata 中 _N_n 的操作。我们比较了两者在总观测数、行号、滞后变量、差分、分组统计、排名和分位数、滚动平均等方面的实现方法。尽管 R 没有完全相同的内置变量,但 dplyr 提供了灵活的数据操作工具。

6. 参考资料和相关推文

Note:产生如下推文列表的 Stata 命令为:
lianxh
安装最新版 lianxh 命令:
ssc install lianxh, replace

  • R for Data Science - Garrett Grolemund & Hadley Wickham
  • 梁淑珍, 2022, Stata编程:_n 和 _N 有啥区别?, 连享会 No.1052.
  • 于颂阳, 2020, Stata: 获取分组回归系数的三种方式, 连享会 No.37.
  • 云锋, 2020, sumup:快速呈现分组统计量, 连享会 No.65.
  • 侯新烁, 2020, Stata数据处理:用-astile-快速创建分组, 连享会 No.324.
  • 胡雨霄, 2018, statsby: 不用循环语句的循环, 连享会 No.108.
  • 袁子晴, 2021, forest-森林图:分组回归系数可视化, 连享会 No.651.
  • 连享会, 2020, Stata:runby - 一切皆可分组计算!, 连享会 No.229.
  • 连玉君, 2020, Stata: 如何检验分组回归后的组间系数差异?, 连享会 No.19.

🍓 课程推荐:2024 机器学习与因果推断专题
主讲老师:司继春 (上海对外经贸大学) ;张宏亮(浙江大学)
课程时间:2024 年 11 月 9-10 日 ;16-17日
课程咨询:王老师 18903405450(微信)

尊敬的老师 / 亲爱的同学们:

连享会致力于不断优化和丰富课程内容,以确保每位学员都能获得最有价值的学习体验。为了更精准地满足您的学习需求,我们诚挚地邀请您参与到我们的课程规划中来。 请您在下面的问卷中,分享您 感兴趣的学习主题或您希望深入了解的知识领域 。您的每一条建议都是我们宝贵的资源,将直接影响到我们课程的改进和创新。 我们期待您的反馈,因为您的参与和支持是我们不断前进的动力。感谢您抽出宝贵时间,与我们共同塑造更加精彩的学习旅程!https://www.wjx.cn/vm/YgPfdsJ.aspx# 再次感谢大家宝贵的意见!

New! Stata 搜索神器:lianxhsongbl  GIF 动图介绍
搜: 推文、数据分享、期刊论文、重现代码 ……
👉 安装:
. ssc install lianxh
. ssc install songbl
👉  使用:
. lianxh DID 倍分法
. songbl all

🍏 关于我们

  • 连享会 ( www.lianxh.cn,推文列表) 由中山大学连玉君老师团队创办,定期分享实证分析经验。
  • 直通车: 👉【百度一下: 连享会】即可直达连享会主页。亦可进一步添加 「知乎」,「b 站」,「面板数据」,「公开课」 等关键词细化搜索。


连享会
连玉君老师团队分享,主页:lianxh.cn。白话计量,代码实操;学术路上,与君同行。
 最新文章