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)
您可以执行以下操作:
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)
| 归档时间: |
|
| 查看次数: |
907 次 |
| 最近记录: |