来自不平衡面板数据的R样本

use*_*868 5 r random-sample panel-data

我正在使用不平衡的面板数据,我希望从中抽取随机样本,该样本不受每单位不同观察数量的影响.例如,在下面的代码中,IBM被选中的可能性是GOOG的两倍,被选中的可能性是MSFT的五倍.有没有办法对这些数据进行抽样,好像每个公司/年都有相同的被选中概率?可能通过使用采样包?

df <- data.frame(COMPANY=c(rep('IBM',50),rep('GOOG',25),rep('MSFT',10)), YEAR=c(1961:2010,1988:2012,1996:2005), PROFIT=rnorm(85))
df

df[sample(nrow(df), 20, replace=FALSE), ]
Run Code Online (Sandbox Code Playgroud)

Jul*_*ora 3

您可以执行以下操作:

probs <- 1 / table(df$COMPANY)[df$COMPANY]
df[sample(nrow(df), 20, replace = FALSE, prob = probs), ]
Run Code Online (Sandbox Code Playgroud)

让我们测试一下:

table(df[sample(nrow(df), 1e6, replace = TRUE, prob = probs), "COMPANY"])
#   GOOG    IBM   MSFT 
# 333499 333080 333421
Run Code Online (Sandbox Code Playgroud)

我们没有让每一行的概率等于 1/(50+25+10),而是将它们标准化,以便每个公司都有相同的被选择概率:

tapply(probs, df$COMPANY, sum)
# GOOG  IBM MSFT 
#   1    1    1
Run Code Online (Sandbox Code Playgroud)

probs总和为 3 而不是 1,但sample要注意这一点)。为了使数学更清晰,让我们举一个简单的例子(它的总和也不等于 1,但这不是问题):

vec <- c(1, 1, 2)
as.vector(1 / table(vec)[vec])
# [1] 0.5 0.5 1.0
Run Code Online (Sandbox Code Playgroud)