【问题标题】:Uneven observation length during bootstrap引导期间观察长度不均匀
【发布时间】:2014-11-12 15:42:59
【问题描述】:

作为 R 的相对初学者,我遇到了困难。我的目标是引导个体的变异系数并将其打印到一个新的数据框以进行进一步的计算和分析,例如,根据他们自己的数据变化为每个人创建 1000 个引导的 CV。这是我在遇到一个我无法解决的问题之前走了多远。我试图在网上找到解决方案,包括在此处搜索,但我无法找到或理解我已经找到了解决方案,即使它很可能在某个地方。如果是这样,请指出我的方向。

我有一个数据集,其中包含对几个人的重复观察,但他们的观察长度与下面的数据中看到的不同

Subject.id  Moderate
    1   943
    1   1132
    1   347
    1   1100
    1   1265
    2   1297
    2   888
    2   1005
    2   1211
    2   1338
    2   1238
    2   916
    2   541
    2   613
    2   692
    2   1538
    2   1071
    3   670
    3   864
    3   1189
    3   320

我正在尝试使用引导包引导个体变异系数。我的开机功能是这样的:

    boot.f<-function(d, i){
  d2 <- d[i,]
  return(sqrt(var(d2$moderate))/mean(d2$moderate))
}

它运行得非常好,像这样:

boot1<-boot(df, boot.f, 1000)

但是,当我尝试像这样使用 strata 参数时:

boot1<-boot(df, boot.f, 1000, strata=subject.id)

我收到以下错误消息:

tapply(seq_len(n), as.numeric(strata)) 中的错误:参数必须 具有相同的长度另外:警告消息:在tapply(seq_len(n)中, as.numeric(strata)) : 强制引入的 NAs

所以我的问题是如何调整我的函数,以便我可以保留主题内的信息并最终获得类似于我使用 summaryBy 函数时的输出,除了一千次? summaryBy(moderate~subject_id, data=df, FUN=CV)

   subject.id             moderate.CV
1        2001             0.3831299
2        2002             0.4972260
3        2003             0.5095434
4        2004             0.2730478
5        2005             0.3645640
6        2006             0.3727822
7        2007             0.3858968
8        2008             0.5833114
9        2009             0.5896946
10       2013             0.4247119
11       2014             0.3016552
12       2015             0.4670444
13       2016             0.3995908
14       2018             0.3908963
15       2019             0.3660683
16       2020             0.3373719
17       2022             0.5020418
18       2023             0.3848056
19       2024             0.6410266
20       2025             0.7070671
21       2026             0.3925212
22       2028             0.1879174
23       2029             0.2912984
24       2030             0.3534441
25       2031             0.2238960
26       2032             0.7491192
27       2033             0.5775261

【问题讨论】:

    标签: r statistics-bootstrap


    【解决方案1】:

    我运行以下命令没有问题:

    library(boot)
    df<-read.table(path.to.your.data)
    boot.f<-function(d, i){
      d2 <- d[i,]
      return(sqrt(var(d2$moderate))/mean(d2$moderate))
    }
    boot(df, boot.f, 1000)
    boot(df, boot.f, 1000, strata=df$subject.id)
    

    变量名(因为您可以在大小写字母之间切换):

       head(df,3)
          subject.id moderate
        1          1      943
        2          1     1132
        3          1      347
    

    【讨论】:

    • 非常感谢!我现在知道我哪里出错了,有时这是你错过的最简单的事情。比如美元符号。引导程序现在也为我运行,但我也意识到我对问题的攻击是错误的,因为我没有得到每个人的输出,因此评估者作为该组的整体 CV。回到绘图板。
    • 酷!请接受答案。您始终可以为每个层运行引导程序。
    • for(i in 1:dim(table(df$subject.id))) print(boot(df[df$subject.id==i,], boot.f, 1000))
    • 再次感谢!这需要我两天时间才能弄清楚。但是,当我运行 for 循环时,我收到此错误消息: 启动错误(df[df$subject.id == i, ], boot.f, 1000) : no data in call to 'boot' 关于什么的任何想法可能是问题吗?
    • 我假设您的组数是 1,2,3,...,似乎某些组“丢失”,例如。 1,2,4,...的组数:for(i in as.integer(names(table(df$subject.id)))) print(boot(df[df$subject.id==i,], boot.f, 1000))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-22
    • 2019-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-24
    • 2016-08-30
    相关资源
    最近更新 更多