我正在尝试获得回归系数的自举SE。使用的数据如下所示:
set.seed(1234)
df <- data.frame(y = rnorm(1:30),
fac1 = as.factor(sample(c("A","B","C","D","E"),30, replace = T)),
fac2 = as.factor(sample(c("NY","NC","CA"),30,replace = T)),
x = rnorm(1:30))
我正在使用boot
包执行引导:
library(boot)
fun <- function(data, index){
data <- df[index,]
reg <- lm(y ~ fac1 + fac2 + x, data)
coef(reg)
}
test.boot <- boot(df, fun, strata = df$fac1, 100)
然而,R抱怨:
Error in boot(df, fun, strata = df$fac1, 100) :
number of items to replace is not a multiple of replacement length
我的情况和前面提到的here完全一样。我理解这里的问题是每个组的观察值都不充分。boot
包中的strata
选项似乎只能对一个因子变量起作用。在我的例子中,我应该根据两个因素对样本进行分层:fac1
和fac2
(如果我在这里的理解不正确,请告诉我)。
我发现stratified
发布的here函数可以根据我的需要生成精确的分层样本。这里的问题是如何将stratified
函数实现为boot
函数,并让boot
函数在正确的示例上工作?
目前,我自己正在编写一个for-loop
,以便使用正确的分层样本运行引导。但我仍然想知道是否可以将stratified
函数合并到boot
中?有什么建议吗?谢谢!
发布于 2016-09-01 23:46:32
在仔细分析了boot
包之后,我想我在不修改boot
的原始代码的情况下找到了解决问题的方法。实际上,boot
提供了一种让用户自定义采样策略的方法。检查help(boot)
中的sim = "parametric"
和ran.gen
选项。
因此,就我的例子而言,我可以简单地指定ran.gen
函数来嵌套stratified
函数,并使用它重新生成用于引导的样本。
fun <- function(data){
reg <- lm(y ~ fac1 + fac2 + x, data)
coef(reg)}
rgen <- function(df,stratified){
#code of stratified goes here and other specifications ... }
test.boot <- boot(df, fun, 1000, sim = "parametric", ran.gen = rgen)
完成了!
https://stackoverflow.com/questions/39234436
复制相似问题