面板调查数据:个人ID去重、数量统计与回归样本优化咨询
问题解决方案
1. 统计独立个体总数
R 实现
- 基础R方法:
length(unique(df$personal_ID)) - dplyr 包简化方法:
dplyr::n_distinct(df$personal_ID)
Python 实现
- Pandas 方法:
df['personal_ID'].nunique() - 基础方法:
len(df['personal_ID'].unique())
2. 回归分析中确保个体仅纳入一次(基于5年区间观测值)
首先需明确个体观测值的选取规则,比如选择5年区间内的第一次/最后一次记录,或是对个体在区间内的重复变量取汇总值(均值、中位数等),以下是两种工具的实现示例:
R 实现(以dplyr为例)
假设数据有year列标记调查年份,先筛选目标5年区间数据,再按个人ID分组选取单条记录:
library(dplyr) # 筛选2018-2022年的观测值 filtered_df <- df %>% filter(year >= 2018 & year <= 2022) # 按个人ID分组,选取每个个体的第一条记录(可替换为last()取最后一条) unique_ind_df <- filtered_df %>% group_by(personal_ID) %>% slice_head(n = 1) # 基于去重后的数据集做回归 model <- lm(dependent_var ~ independent_vars, data = unique_ind_df)
若需对重复变量做汇总(比如取均值):
aggregated_df <- filtered_df %>% group_by(personal_ID) %>% summarise( dependent_var = mean(dependent_var, na.rm = TRUE), across(independent_vars, mean, na.rm = TRUE) ) model <- lm(dependent_var ~ ., data = aggregated_df)
Python 实现(以Pandas为例)
先筛选5年区间数据,再分组去重:
import pandas as pd # 筛选2018-2022年的观测值 filtered_df = df[(df['year'] >= 2018) & (df['year'] <= 2022)] # 按个人ID分组,取每个个体的第一条记录(keep='first',可换'last') unique_ind_df = filtered_df.drop_duplicates(subset='personal_ID', keep='first') # 回归分析(以statsmodels为例) import statsmodels.api as sm X = sm.add_constant(unique_ind_df[['independent_var1', 'independent_var2']]) y = unique_ind_df['dependent_var'] model = sm.OLS(y, X).fit()
若需汇总重复变量:
aggregated_df = filtered_df.groupby('personal_ID').agg( dependent_var=('dependent_var', 'mean'), independent_var1=('independent_var1', 'mean'), independent_var2=('independent_var2', 'mean') ).reset_index() # 后续回归步骤同上
内容的提问来源于stack exchange,提问作者Urs IKARUrS
相关产品推荐
相关产品推荐

