我正在处理不平衡的面板数据,我想从中抽取一个随机样本,该样本不受每单位观测值的不同影响。例如,在下面的代码中,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), ]

最佳答案

您可以执行以下操作:

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

让我们对其进行测试:
table(df[sample(nrow(df), 1e6, replace = TRUE, prob = probs), "COMPANY"])
#   GOOG    IBM   MSFT
# 333499 333080 333421

我们没有对每一行的概率等于1/(50 + 25 + 10),而是对其进行了归一化,以便每个公司都有相等的概率被选择:
tapply(probs, df$COMPANY, sum)
# GOOG  IBM MSFT
#   1    1    1

(probs的总和为3,而不是1,但是sample负责此操作)。为了使数学更清楚,让我们举一个简单的例子(它又不等于1,但这不是问题):
vec <- c(1, 1, 2)
as.vector(1 / table(vec)[vec])
# [1] 0.5 0.5 1.0

关于来自不平衡面板数据的R样本,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20527918/

10-09 17:58
查看更多