首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >自定义`boot`包中的分层采样策略

自定义`boot`包中的分层采样策略
EN

Stack Overflow用户
提问于 2016-08-31 02:14:21
回答 1查看 936关注 0票数 2

我正在尝试获得回归系数的自举SE。使用的数据如下所示:

代码语言:javascript
运行
复制
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包执行引导:

代码语言:javascript
运行
复制
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抱怨:

代码语言:javascript
运行
复制
Error in boot(df, fun, strata = df$fac1, 100) : 
number of items to replace is not a multiple of replacement length

我的情况和前面提到的here完全一样。我理解这里的问题是每个组的观察值都不充分。boot包中的strata选项似乎只能对一个因子变量起作用。在我的例子中,我应该根据两个因素对样本进行分层:fac1fac2 (如果我在这里的理解不正确,请告诉我)。

我发现stratified发布的here函数可以根据我的需要生成精确的分层样本。这里的问题是如何将stratified函数实现为boot函数,并让boot函数在正确的示例上工作?

目前,我自己正在编写一个for-loop,以便使用正确的分层样本运行引导。但我仍然想知道是否可以将stratified函数合并到boot中?有什么建议吗?谢谢!

EN

回答 1

Stack Overflow用户

发布于 2016-09-01 23:46:32

在仔细分析了boot包之后,我想我在不修改boot的原始代码的情况下找到了解决问题的方法。实际上,boot提供了一种让用户自定义采样策略的方法。检查help(boot)中的sim = "parametric"ran.gen选项。

因此,就我的例子而言,我可以简单地指定ran.gen函数来嵌套stratified函数,并使用它重新生成用于引导的样本。

代码语言:javascript
运行
复制
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)

完成了!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39234436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档