0

我正在尝试对面板数据和每年进行 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))
4

1 回答 1

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'sfilter函数了。再次让我用 Grunfeld 的数据来说明:

library(dplyr)
Grunfeld_gt1940 <- filter(Grunfeld, year>1940) ## the "gt" stands for "greater than". 

已编辑

如果要按照与原始数据相同的方式排列新数据,可以使用rownames提取原始顺序:

temp <- temp[order(as.numeric(rownames(temp))), ]

## Add the winsorized variables to the original data
names(temp)[1:2] <- c("inv_wins", "value_wins")
Grunfeld_new <- data.frame(Grunfeld, temp[, c("inv_wins", "value_wins")])
于 2014-07-21T13:05:14.310 回答