gpt4 book ai didi

r - 将 MASS::fitdistr 按一个因子应用于多个数据

转载 作者:行者123 更新时间:2023-12-04 00:11:10 26 4
gpt4 key购买 nike

我的问题在最后以粗体显示。

我知道如何使 beta 分布适合某些数据。例如:

library(Lahman)
library(dplyr)

# clean up the data and calculate batting averages by playerID
batting_by_decade <- Batting %>%
filter(AB > 0) %>%
group_by(playerID, Decade = round(yearID - 5, -1)) %>%
summarize(H = sum(H), AB = sum(AB)) %>%
ungroup() %>%
filter(AB > 500) %>%
mutate(average = H / AB)

# fit the beta distribution
library(MASS)
m <- MASS::fitdistr(batting_by_decade$average, dbeta,
start = list(shape1 = 1, shape2 = 10))

alpha0 <- m$estimate[1]
beta0 <- m$estimate[2]

# plot the histogram of data and the beta distribution
ggplot(career_filtered) +
geom_histogram(aes(average, y = ..density..), binwidth = .005) +
stat_function(fun = function(x) dbeta(x, alpha0, beta0), color = "red",
size = 1) +
xlab("Batting average")

其产量:

enter image description here

现在我想为数据的每个 batting_by_decade$Decade 列计算不同的 beta 参数 alpha0beta0,所以我最终得到 15参数集和 15 个 beta 分布,我可以将它们拟合到按 Decade 划分的击球平均值 ggplot 中:

batting_by_decade %>% 
ggplot() +
geom_histogram(aes(x=average)) +
facet_wrap(~ Decade)

enter image description here

我可以通过对每个十年进行过滤,并将该十年的数据传递到 fidistr 函数中来硬编码,对所有十年重复此操作,但是有没有一种方法可以计算所有快速且可重复地每十年测试一次参数,也许可以使用应用函数之一?

最佳答案

您可以利用 summarise 以及两个自定义函数来实现此目的:

getAlphaEstimate = function(x) {MASS::fitdistr(x, dbeta,start = list(shape1 = 1, shape2 = 10))$estimate[1]}

getBetaEstimate = function(x) {MASS::fitdistr(x, dbeta,start = list(shape1 = 1, shape2 = 10))$estimate[2]}

batting_by_decade %>%
group_by(Decade) %>%
summarise(alpha = getAlphaEstimate(average),
beta = getBetaEstimate(average)) -> decadeParameters

但是,根据 Hadley 的帖子,您将无法使用 stat_summary 绘制它:https://stackoverflow.com/a/1379074/3124909

关于r - 将 MASS::fitdistr 按一个因子应用于多个数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45654264/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com