根据面板数据中的索引阻止采样

时间:2015-01-26 12:52:36

标签: r random-sample bootstrapping

我有一个面板数据,即t个观察点n的{​​{1}}行,例如

nxt

我想要进行块引导,即我想要替换重新采样,在所观察的所有年份中采用公司[i]。例如,如果随机抽取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 和公司1,我希望公司[1]将在新样本中3次,对应year=1935:1937。如果它被重新绘制,那么它必须再次为3次。此外,我需要将自己的函数应用于新的自举样本,我需要这样做500次。 我目前的代码是这样的:

year=1935:1937

我正在考虑通过以正确的方式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, ?? )的索引作为平滑和干净的工作。我怎么能这样做?还有其他更有效的替代方案吗?

EDIT。 我不一定需要一个新的boot.function。我只需要一个(可能很快)代码,允许用替换重新采样,然后我将它放在firm参数中作为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 ,因此重新采样应适用于整个区块。希望这澄清

2 个答案:

答案 0 :(得分: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 ...

答案 1 :(得分:0)

您可以使用启动功能的“strata”参数执行此操作。这称为分层自举。 更改代码的最后一行:

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

我压制了参数ran.gen&amp; SIM

我建议这些更改启动功能,以便它正常工作:

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)
}