2015-01-26 1 views
2

У меня есть панель данных, т.е. t строки для каждой из n наблюдений (nxt), такие, какБлок выборки по индексу в панельных данных

data("Grunfeld", package="plm") 
head(Grunfeld) 
firm year inv value capital 
    1 1935 317.6 3078.5  2.8 
    1 1936 391.8 4661.7 52.6 
    1 1937 410.6 5387.1 156.9 
    2 1935 257.7 2792.2 209.2 
    2 1936 330.8 4313.2 203.4 
    2 1937 461.2 4643.9 207.2 

Хочу сделать блок самонастройку, т.е. я хочу ресэмплировать с замены, взятия фирмы [i] со всеми годами, в которых она наблюдается. Например, если year=1935:1937 и фирма 1 случайным образом нарисованы, я хочу, чтобы фирма [1] была в новом образце 3 раза, что соответствует year=1935:1937. Если он перерисовывается, то он должен быть снова 3 раза. Кроме того, мне нужно применить свою собственную функцию к новому загрузочному образцу, и мне нужно сделать это 500 раз. Мой текущий код-то вроде этого:

library(boot) 
boot.fun <- function(data) { 
    est.boot = myfunction(y=Grunfeld$v1, x=Grunfeld$v2, other parameters) 
    return(est.boot) 
} 
boot.sim <- function(data, mle) { 
data = sample(data, ??) # 
return(data) 
} 

start.time = Sys.time() 
result.boot <- boot(Grunfeld, myfunction(...), R=500, sim = "parametric", 
       ran.gen = boot.sim) 
Sys.time() - start.time 

Я подумывал ресэмплировать, указав в правильном пути data = sample(data, ??), как он работает гладкой и чистой, используя в качестве индекса столбца firm. Как я мог это сделать? Есть ли другая более эффективная альтернатива?

EDIT. Мне не обязательно нужна новая функция boot.function. Мне просто нужен (возможно быстрый) код, который позволяет перепробовать с заменой, тогда я поставлю его внутри аргумента boot как ran.gen=code.which.works. Результат должен быть образцом того же размера оригинала, хотя фирмы могут быть случайным образом выбраны дважды или более (или не выбраны). Например результат может быть

head(GrunfeldResampled) 
firm year inv value capital 
    2 1935 257.7 2792.2 209.2 
    2 1936 330.8 4313.2 203.4 
    2 1937 461.2 4643.9 207.2 
    1 1935 317.6 3078.5 2.8 
    1 1936 391.8 4661.7 52.6 
    1 1937 410.6 5387.1 156.9 
    2 1935 257.7 2792.2 209.2 
    2 1936 330.8 4313.2 203.4 
    2 1937 461.2 4643.9 207.2 
    9 1935 317.6 3078.5 122.8 
    9 1936 391.8 4661.7 342.6 
    9 1937 410.6 5387.1 156.9 

В основном мне нужна каждая фирма трактуется как block, и поэтому передискретизации должны применяться ко всему блоку. Надеюсь, это уточнит

+0

Но в этом случае нет элемента случайности. Фирма 1 появляется один раз в каждый из трех лет, и вы хотите, чтобы все эти три года назад. Для чего нужна загрузка? Или вы хотите, чтобы случайные фирмы были выбраны (по некоторому числу, предоставленному в качестве входных данных, например, как 5 фирм?) И в зависимости от того, какие из них будут выбраны, все годы, которые будут отображаться? – LyzandeR

+0

Кроме того, если это делается путем замены и предполагается, что вы хотите, чтобы все годы для конкретной фирмы, что произойдет, если одна и та же компания будет выбрана дважды? Тебе нужны все годы два раза? И как выбирается количество фирм? Вы хотите сделать функцию, чтобы иметь возможность указать ее самостоятельно? – LyzandeR

+0

Привет. Мне нужно, чтобы фирмы были выбраны случайным образом. Если фирма собирается дважды, то она появляется дважды со всеми соответствующими годами. Количество фирм в исходном образце - 'N', каждый из которых наблюдается для' T' лет: сбалансированная панель с наблюдениями NxT. Поэтому мне нужна передискретизация с заменой, которая дает образец размера «NxT», – Bob

ответ

1

Видимо в этом ответе каждая фирма рассматривается в течение ровно 20 лет, поэтому я не буду иметь проблем, демонстрирующие:

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

Решение

#n is the the firms column, df is the dataframe 
myfunc <- function(n,df) {  #define function 
unique_firms <- unique(n)  #unique firms 
sample_firms <- sample(unique_firms, size=length(unique_firms), replace=T) #choose from unique firms randomly with replacement 
new_df <- do.call(rbind, lapply(sample_firms, function(x) df[df$firm==x,])) #fetch all years for each randomly picked firm and rbind 
} 

a <- myfunc(Grunfeld$firm, Grunfeld) #run function 

Выход

> str(a) 
'data.frame': 200 obs. of 5 variables: 
$ firm : int 4 4 4 4 4 4 4 4 4 4 ... 
$ year : int 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 ... 
$ inv : num 40.3 72.8 66.3 51.6 52.4 ... 
$ value : num 418 838 884 438 680 ... 
$ capital: num 10.5 10.2 34.7 51.8 64.3 67.1 75.2 71.4 67.1 60.5 ... 

Как вы можете видеть dim точно так же, как и вход data.frame

Для ваших данных решение будет:

myfunc <- function(n,df) {  #define function 
    unique_firms <- unique(n)  #unique firms 
    print(unique_firms) 
    sample_firms <- sample(unique_firms, size=length(unique_firms), replace=T) #choose from unique firms randomly with replacement 
    new_df <- do.call(rbind, lapply(sample_firms, function(x) df[df$country==x,])) #fetch all years for each randomly picked firm and rbind 
} 

и Вывод:

> str(a) 
'data.frame': 848 obs. of 18 variables: 
$ isocode : Factor w/ 106 levels "AGO","ALB","ARG",..: 82 82 82 82 82 82 82 82 61 61 ... 
$ time  : int 2 3 4 5 6 7 8 9 2 3 ... 
$ country : num 80 80 80 80 80 80 80 80 59 59 ... 
$ year  : int 1975 1980 1985 1990 1995 2000 2005 2010 1975 1980 ... 
$ gdp  : num 184619 210169 199343 268870 305255 ... 
$ pop  : num 33.4 34.9 36.6 37.8 38.3 ... 
$ gdp_k : num 5526 6022 5443 7117 7969 ... 
$ co2  : num 340353 431436 426881 431052 350874 ... 
$ co2_k : num 10191 12333 11674 11407 9128 ... 
$ oecd  : int 1 1 1 1 1 1 1 1 1 1 ... 
$ LI  : int 0 0 0 0 0 0 0 0 0 0 ... 
$ LMI  : int 0 0 0 0 0 0 0 0 0 0 ... 
$ UMI  : int 0 0 0 0 0 0 0 0 0 0 ... 
$ HI  : int 1 1 1 1 1 1 1 1 1 1 ... 
$ gdpk  : num 5531 6018 5449 7118 7971 ... 
$ co2k  : num 10196 12355 11668 11412 9162 ... 
$ co2_k.lag: num 8595 10191 12333 11674 11407 ... 
$ gdp_k.lag: num 4730 5526 6022 5443 7117 ... 
+0

Спасибо за ваш ответ. Ваше решение работает с образцом Grunfeld. Однако, когда применяется к моей, 'a' является объектом с наблюдениями' 0'. Столбец id ('фирмы') - это факторный столбец, значения которого являются именами стран (« Ангола »,« Бразиль », ...). Я не знаю, поможет ли это.Я получаю также это предупреждение 50 сообщений '50: In is.na (e1): is.na() применяется к non (списку или вектору) типа« NULL ». Мои данные - это data.frame, как Grunfeld. – Bob

+0

Я только что попробовал выше с фактором типа 'фирма', и он отлично работает, если честно. – LyzandeR

+0

Вы уверены, что ничего не пропали? Я думаю, что он должен работать, потому что факторы на самом деле целые. Вы можете дать ему шаг, преобразовать столбцы факторов в символ и повторить попытку, но он должен работать с факторами ... Я не могу сказать ничего другого без данных ... – LyzandeR

0

Вы можете сделать это с помощью параметра «strata» функции загрузки. Это называется стратифицированным бутстрапом. Изменение последней строки кода:

result.boot <- boot(Grunfeld, boot.fun, R=500, sim = "ordinary", 
       strata = Grunfeld$firm) 

я подавлена ​​параметр побежал.ген & сим

Я предлагаю тезисы изменения в функцию загрузки, так что работает правильно:

boot.fun <- function(d, i) { # d being your data, i the set of indices) 
    est.boot = myfunction(y=d[i ,]$v1, x=d[i, ]$v2, other parameters) 
    return(est.boot) 
} 
+0

Спасибо. Есть ли способ проверить, выполнены ли загруженные образцы правильно? – Bob

+0

не уверен, что вы подразумеваете под «правильно», но вы можете сделать таблицу (result.boot $ strata), чтобы визуализировать перераспределение ваших страт. однако я не уверен, что вы можете получить индексы выборочных строк для каждого отдельного бутстрапа. – agenis

+0

Ошибка в статистике (данные, оригинал, ...): неиспользуемый аргумент (оригинал) – Bob