我有以下数据框:
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
答案 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)
答案 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))