【问题标题】:Displaying a density plot from a bootstrap从 bootstrap 显示密度图
【发布时间】:2018-02-28 07:22:21
【问题描述】:

我有以下数据框:

z<-data.frame(A=c(40, 41, 42, 45, 46, 47, 48, 46, 45, 38, 41, 42, 46, 39, 45, 47, 48, 50, 39, 41), B=c('California', 'Arizona', 'Texas','Arizona', 'Arizona', 'Texas', 'California', 'California', 'Texas', 'California', 'Arizona', 'Texas', 'Texas', 'California', 'Texas', 'Arizona', 'California', 'California', 'Arizona', 'Arizona'))

我对引导比较陌生,所以想弄清楚如何从“scratch”开始执行以下操作(我知道 R 中有一些包使以下任务变得相当简单)。

我想:

  1. 获取各州平均工作小时数的抽样分布。

  2. 在同一图上显示每个状态的密度图

【问题讨论】:

  • Bootstrapping 与 Bootstrap 4 无关。删除该标签。

标签: r statistics-bootstrap


【解决方案1】:

我也是引导新手。请看看下面的工作流程是否有意义。

首先,对有放回的行进行 1000 次采样,并将所有重采样合并到一个数据帧中。

library(tidyverse)

set.seed(5528)

z_re <- map_dfr(1:1000, function(i){
  z2 <- z %>%
    group_by(B) %>%
    sample_frac(size = 1, replace = TRUE) %>%
    ungroup() %>%
    mutate(Time = i)
  return(z2)
})

其次,通过B和重采样时间计算平均值。

z_re2 <- z_re %>%
  group_by(B, Time) %>%
  summarise(Average = mean(A)) %>%
  ungroup()

最后,绘制数据。

ggplot(z_re2, aes(x = Average, fill = B, color = B)) +
  geom_density(alpha = 0.5)

【讨论】:

    【解决方案2】:

    不太确定在考虑分层时是否需要引导(这是@www 的答案中使用的组)。

    下面是一个只对data.frame的行进行替换的实现,而不考虑组:

    # function to calculate mean of A wrt B
    mean_func = function(df)tapply(df$A,df$B,mean)
    
    # replicate runs the function each time with a sampled data.frame
    boot_res = t(replicate(1000,mean_func(z[sample(nrow(z),replace=TRUE),])))
    > head(boot_res)
          Arizona California    Texas
    [1,] 42.25000   43.66667 43.80000
    [2,] 44.00000   45.25000 46.40000
    [3,] 42.66667   41.88889 44.80000
    [4,] 42.87500   47.33333 44.33333
    [5,] 41.66667   45.16667 43.12500
    [6,] 42.20000   42.09091 44.00000
    

    在上面的矩阵中,每个组都有一个分布。要绘制它,可以使用base R:

    COLS = c("#f08a5d","#b83b5e","#6a2c70")
    names(COLS) = colnames(boot_res)
    LIMS = round(range(boot_res))
    
    plot(NULL,xlim=LIMS,ylim=c(0,0.8),xlab="Mean",ylab="Density")
    for(i in names(COLS)){
    lines(density(boot_res[,i]),col=COLS[i])
    }
    legend("topleft",fill=COLS,names(COLS))
    

    【讨论】:

      猜你喜欢
      • 2012-11-16
      • 1970-01-01
      • 1970-01-01
      • 2016-11-13
      • 1970-01-01
      • 2013-12-21
      • 1970-01-01
      • 2018-08-05
      • 2020-08-17
      相关资源
      最近更新 更多