Я пытаюсь выполнить 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 и стоимость) по всем фирмам и сохранить их в кадре данных с той же структурой. Я попробовал следующий код:
Цель в основном состоит в том, чтобы получить винсоризированную копию исходного фрейма данных (все структурировано одинаково).
Как предложено ниже, 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))