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>
我有一个无法解决的问题,我自己尝试了多种方法。
目标:我想对不同事件年份的各个变量进行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>