从引导程序显示密度图

时间:2018-02-28 07:22:21

标签: r bootstrapping

我有以下数据框:

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'))

我相对较新的引导,所以想知道如何从&#39; scratch&#39; (我知道R中有一些软件包使得以下任务变得微不足道)。

我想:

1. Obtain the sampling distribution of the mean numbers of hours worked by state.

2. Display a density plot for each state on the same plot

2 个答案:

答案 0 :(得分: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)

enter image description here

答案 1 :(得分:1)

不确定在考虑分层(@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

在上面的矩阵中,每个组都有一个分布。要进行绘制,可以使用基数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))

enter image description here