按年度对面板数据(数据帧)进行Winsorizing,并针对特定条件进行修整

时间:2014-07-21 11:49:15

标签: r outliers panel-data

我正在尝试使用面板数据和每年的winsorize(替换值与平均值相差2或3个标准偏差的异常值)。我安装了包含这样一个函数的robustHD软件包,但是我无法在我的数据集上实现它。

我的数据集与Grunfeld(虽然我有NA)在同一年看起来与不同的公司相似。 (1935年至1954年)

> head(Grunfeld, 6)
  firm year   inv  value capital
1    1 1935 317.6 3078.5     2.8
2    1 1936 391.8 4661.7    52.6
3    1 1937 410.6 5387.1   156.9
4    1 1938 257.7 2792.2   209.2
5    1 1939 330.8 4313.2   203.4
6    1 1940 461.2 4643.9   207.2

我现在要做的是仅对所有公司的某些列(即inv和value)进行winsorize,并将其存储在具有相同结构的数据框中。我尝试了以下代码:

目标基本上是获取原始数据框的winsorized副本(所有内容都以相同的方式构建)。

如下所述,plyr是分割数据帧和应用函数的好方法,但我无法使其工作。

library(plm)
library(robustHD)
library(plyr)

data("Grunfeld", package="plm")

#Winsorize data  each year (over all firms) therefore split dataframe for each year and apply the winsorize function)

Grunfeld.w<-ddply(Grunfeld, .(year) function(x) winsorize(x$inv,x$value))

1 个答案:

答案 0 :(得分:2)

您可以预先创建一个列表来存储数据框。列表的长度必须为n,其中n是年份中唯一值的数量。

library(plm)
library(robustHD)
data("Grunfeld", package="plm")

## determine unique values in year and their length
unique_years <- unique(Grunfeld$year)
n_unique_years <- length(unique_years)

## create an empty list of length 20
Grunfeld.w <- vector("list", length=n_unique_years)

for(i in 1:n_unique_years){
  Grunfeld.w[[i]]  <- winsorize(subset(Grunfeld, year==unique_years[i], 
                                       select=c(inv, value)))

  ## add the year field to each insorized data frame
  Grunfeld.w[[i]] <- cbind(Grunfeld.w[[i]], year=unique_years[i])
}

现在每个winsorized数据都作为数据框存储在Grunfeld.w列表中。如果只需要一个数据框,请使用以下命令:

## convert the list to one data frame
temp <- data.frame(do.call("rbind", Grunfeld.w))

至于你的第二个问题,我猜你想要根据某些特征选择“主题”(例如,x> 5000),但你不想使用subset功能。然后你可以使用dplyr的{​​{1}}函数..再次让我用Grunfeld数据来说明:

filter

被修改

如果您想以与原始数据相同的方式排列新数据,可以使用library(dplyr) Grunfeld_gt1940 <- filter(Grunfeld, year>1940) ## the "gt" stands for "greater than". 提取原始订单:

rownames