在 R 中使用建模器 bootstrap 获取中位数
Using modelrs bootstrap in R for medians
我发现以下有效
iris %>%
select(Sepal.Length) %>%
modelr::bootstrap(100) %>%
mutate(mean = map(strap, mean))
但下面没有
iris %>%
select(Sepal.Length) %>%
modelr::bootstrap(100) %>%
mutate(median = map(strap, median))
唯一不同的是第二行代码使用了中位数。
我得到的错误是
Error in mutate_impl(.data, dots) : Evaluation error: unimplemented type 'list' in 'greater' .
代码看起来可以正常工作,但如果你 unnest
它,你实际上只是得到了很多 NA
,因为你正在尝试使用 mean
resample
对象的,它是一个分类列表,其中引用了重新采样的数据和特定重新采样的索引。取这样一个列表的平均值是没有用的,所以 returning NA
带有警告是有用的行为。要使代码正常工作,请将重采样强制转换为数据框,您可以在 map
的匿名函数中像往常一样对其进行操作。
对于直接路线,提取数据并取平均值,将列表简化为数值向量 map_dbl
:
library(tidyverse)
set.seed(47)
iris %>%
select(Sepal.Length) %>%
modelr::bootstrap(100) %>%
mutate(sepal_mean = map_dbl(strap, ~mean(as_data_frame(.x)$Sepal.Length)))
#> # A tibble: 100 x 3
#> strap .id sepal_mean
#> <list> <chr> <dbl>
#> 1 <S3: resample> 001 5.844000
#> 2 <S3: resample> 002 6.016000
#> 3 <S3: resample> 003 5.851333
#> 4 <S3: resample> 004 5.869333
#> 5 <S3: resample> 005 5.840667
#> 6 <S3: resample> 006 5.825333
#> 7 <S3: resample> 007 5.824000
#> 8 <S3: resample> 008 5.790000
#> 9 <S3: resample> 009 5.858000
#> 10 <S3: resample> 010 5.810000
#> # ... with 90 more rows
将此方法转换为 median
效果很好:
iris %>%
select(Sepal.Length) %>%
modelr::bootstrap(100) %>%
mutate(sepal_median = map_dbl(strap, ~median(as_data_frame(.x)$Sepal.Length)))
#> # A tibble: 100 x 3
#> strap .id sepal_median
#> <list> <chr> <dbl>
#> 1 <S3: resample> 001 5.9
#> 2 <S3: resample> 002 5.8
#> 3 <S3: resample> 003 5.8
#> 4 <S3: resample> 004 5.7
#> 5 <S3: resample> 005 5.7
#> 6 <S3: resample> 006 5.8
#> 7 <S3: resample> 007 5.8
#> 8 <S3: resample> 008 5.7
#> 9 <S3: resample> 009 5.8
#> 10 <S3: resample> 010 5.7
#> # ... with 90 more rows
如果您同时想要中位数和均值,您可以反复将重采样强制到数据框,或将其存储在另一列中,但这两种方法都不是很有效。最好 return 具有 map
的数据帧列表,可以 unnest
ed:
iris %>%
select(Sepal.Length) %>%
modelr::bootstrap(100) %>%
mutate(stats = map(strap, ~summarise_all(as_data_frame(.x), funs(mean, median)))) %>%
unnest(stats)
#> # A tibble: 100 x 4
#> strap .id mean median
#> <list> <chr> <dbl> <dbl>
#> 1 <S3: resample> 001 5.744667 5.60
#> 2 <S3: resample> 002 5.725333 5.70
#> 3 <S3: resample> 003 5.808667 5.70
#> 4 <S3: resample> 004 5.809333 5.70
#> 5 <S3: resample> 005 5.964000 5.85
#> 6 <S3: resample> 006 5.931333 5.95
#> 7 <S3: resample> 007 5.838667 5.80
#> 8 <S3: resample> 008 5.926000 5.95
#> 9 <S3: resample> 009 5.855333 5.75
#> 10 <S3: resample> 010 5.888667 5.70
#> # ... with 90 more rows
更新后的语法为:
iris %>%
select(Sepal.Length) %>%
modelr::bootstrap(100) %>%
mutate(stats = map(strap, ~summarise_all(as_tibble(.x), list(mean = mean, median = median)))) %>%
unnest(stats)
因为 as_data_frame
和 funs
已弃用
我发现以下有效
iris %>%
select(Sepal.Length) %>%
modelr::bootstrap(100) %>%
mutate(mean = map(strap, mean))
但下面没有
iris %>%
select(Sepal.Length) %>%
modelr::bootstrap(100) %>%
mutate(median = map(strap, median))
唯一不同的是第二行代码使用了中位数。
我得到的错误是
Error in mutate_impl(.data, dots) : Evaluation error: unimplemented type 'list' in 'greater' .
代码看起来可以正常工作,但如果你 unnest
它,你实际上只是得到了很多 NA
,因为你正在尝试使用 mean
resample
对象的,它是一个分类列表,其中引用了重新采样的数据和特定重新采样的索引。取这样一个列表的平均值是没有用的,所以 returning NA
带有警告是有用的行为。要使代码正常工作,请将重采样强制转换为数据框,您可以在 map
的匿名函数中像往常一样对其进行操作。
对于直接路线,提取数据并取平均值,将列表简化为数值向量 map_dbl
:
library(tidyverse)
set.seed(47)
iris %>%
select(Sepal.Length) %>%
modelr::bootstrap(100) %>%
mutate(sepal_mean = map_dbl(strap, ~mean(as_data_frame(.x)$Sepal.Length)))
#> # A tibble: 100 x 3
#> strap .id sepal_mean
#> <list> <chr> <dbl>
#> 1 <S3: resample> 001 5.844000
#> 2 <S3: resample> 002 6.016000
#> 3 <S3: resample> 003 5.851333
#> 4 <S3: resample> 004 5.869333
#> 5 <S3: resample> 005 5.840667
#> 6 <S3: resample> 006 5.825333
#> 7 <S3: resample> 007 5.824000
#> 8 <S3: resample> 008 5.790000
#> 9 <S3: resample> 009 5.858000
#> 10 <S3: resample> 010 5.810000
#> # ... with 90 more rows
将此方法转换为 median
效果很好:
iris %>%
select(Sepal.Length) %>%
modelr::bootstrap(100) %>%
mutate(sepal_median = map_dbl(strap, ~median(as_data_frame(.x)$Sepal.Length)))
#> # A tibble: 100 x 3
#> strap .id sepal_median
#> <list> <chr> <dbl>
#> 1 <S3: resample> 001 5.9
#> 2 <S3: resample> 002 5.8
#> 3 <S3: resample> 003 5.8
#> 4 <S3: resample> 004 5.7
#> 5 <S3: resample> 005 5.7
#> 6 <S3: resample> 006 5.8
#> 7 <S3: resample> 007 5.8
#> 8 <S3: resample> 008 5.7
#> 9 <S3: resample> 009 5.8
#> 10 <S3: resample> 010 5.7
#> # ... with 90 more rows
如果您同时想要中位数和均值,您可以反复将重采样强制到数据框,或将其存储在另一列中,但这两种方法都不是很有效。最好 return 具有 map
的数据帧列表,可以 unnest
ed:
iris %>%
select(Sepal.Length) %>%
modelr::bootstrap(100) %>%
mutate(stats = map(strap, ~summarise_all(as_data_frame(.x), funs(mean, median)))) %>%
unnest(stats)
#> # A tibble: 100 x 4
#> strap .id mean median
#> <list> <chr> <dbl> <dbl>
#> 1 <S3: resample> 001 5.744667 5.60
#> 2 <S3: resample> 002 5.725333 5.70
#> 3 <S3: resample> 003 5.808667 5.70
#> 4 <S3: resample> 004 5.809333 5.70
#> 5 <S3: resample> 005 5.964000 5.85
#> 6 <S3: resample> 006 5.931333 5.95
#> 7 <S3: resample> 007 5.838667 5.80
#> 8 <S3: resample> 008 5.926000 5.95
#> 9 <S3: resample> 009 5.855333 5.75
#> 10 <S3: resample> 010 5.888667 5.70
#> # ... with 90 more rows
更新后的语法为:
iris %>%
select(Sepal.Length) %>%
modelr::bootstrap(100) %>%
mutate(stats = map(strap, ~summarise_all(as_tibble(.x), list(mean = mean, median = median)))) %>%
unnest(stats)
因为 as_data_frame
和 funs
已弃用