R Winsorizing 不同面板数据年份的单个变量

R Winsorizing individual variables in different panel data years

我有一个无法解决的问题,我自己尝试了多种方法。

目标:我想对不同事件年份的各个变量进行winsorize。

也就是说,我想对每个事件年份 (-5,-4,-3...+4,+5) 的变量 var 1(和 var 2、var 3 等)的所有观测值进行winsorize

想象以下数据结构(pdata.frame,plm 包的对象,据我所知其行为类似于普通数据框):

#firm-year observations with different numeric variables, sequences only for illustrative purposes, true variables are empirical observations
firms <- c(rep("firm a",11), rep("firm b", 11))
years <- seq(-5,5,1)
var1 <- seq(0,2.1,0.1)
var2 <- seq(0,21,1)
var3 <- seq(0,1,1/21)

#create panel data
df <- data.frame(cbind(firms,years,var1,var2,var3))
library(plm)
p.df <- pdata.frame(df, index=c("firms","years"))

# NAs in my variables exist 
p.df[12,3] = NA
p.df[10,5] = NA

p.df

我的数据框看起来像这样:

           firms years var1 var2               var3
firm a--1 firm a    -1  0.4    4   0.19047619047619
firm a--2 firm a    -2  0.3    3  0.142857142857143
firm a--3 firm a    -3  0.2    2 0.0952380952380952
firm a--4 firm a    -4  0.1    1 0.0476190476190476
firm a--5 firm a    -5    0    0                  0
firm a-0  firm a     0  0.5    5  0.238095238095238
firm a-1  firm a     1  0.6    6  0.285714285714286
firm a-2  firm a     2  0.7    7  0.333333333333333
firm a-3  firm a     3  0.8    8  0.380952380952381
firm a-4  firm a     4  0.9    9               <NA>
firm a-5  firm a     5    1   10  0.476190476190476
firm b--1 firm b    -1 <NA>   15  0.714285714285714
firm b--2 firm b    -2  1.4   14  0.666666666666667
firm b--3 firm b    -3  1.3   13  0.619047619047619
firm b--4 firm b    -4  1.2   12  0.571428571428571
firm b--5 firm b    -5  1.1   11  0.523809523809524
firm b-0  firm b     0  1.6   16  0.761904761904762
firm b-1  firm b     1  1.7   17   0.80952380952381
firm b-2  firm b     2  1.8   18  0.857142857142857
firm b-3  firm b     3  1.9   19  0.904761904761905
firm b-4  firm b     4    2   20  0.952380952380952
firm b-5  firm b     5  2.1   21                  1

我的显然有更多的观察和变量。

我找到的最接近的解决方案是 Masato。 Masato 使用的 robustHD::winsorize 与具有 NA 的数据不兼容。 DescTools:Winsorize 反过来不接受数据帧,并将在所有没有意义的变量列上对我的数据进行 winsorize。

我想解决方案在于编写另一个 for 循环并在提取单个事件年(-5 到 +5)后对各个列使用 DescTools::Winsorize。 另一种方法是使 robustHD::winsorize 函数以某种方式处理 NA,并将其应用于 var1 到 var3 的整个帧。

非常感谢你在这方面的帮助,并很乐意在这里提出你的建议。

此致, 软木

试试这个:

library(tidyverse)

p.df%>%
  as.tibble()%>%
  group_by(years)%>%
  mutate(across(c(var1,var2,var3),as.double))%>%
  mutate(across(c(var1,var2,var3),~DescTools::Winsorize(.x,na.rm=T)))
<span class="math-container">```</span>