如何使用 fitdist 的结果在 R 中创建概率分布?
How can I use the results from fitdist to create a probability distribution in R?
我使用 fitdistrplus 包中的 fitdist 对我的数据进行(伽玛)分布拟合:
fitg <- fitdist(mdt, "gamma")
结果是描述拟合的参数列表。我想知道是否有一种方法可以使用该结果从该分布创建累积分布函数和随机样本生成器。
例如,如果用 fitdist 拟合的分布对应于均值 0 和 sd 1 的正态分布,我如何轻松地重新创建 pnorm(..,0,1) 和 rnorm(..,0,1) ?
我知道我可以手动完成,但是如果有一个“自动”执行的功能对我来说会容易得多,因为我必须对许多不同的数据集执行此操作,这些数据集将适合不同类型的分布.
非常感谢您的帮助!
你想要下面这样的东西吗?
library(fitdistrplus)
data <- rnorm(1000, 0.01, 1.01) # sampled from original distribution N(0.01, 1.01^2)
fit_and_draw_sample <- function(data, nsamples, distr='norm') {
if (distr == 'norm') {
fitg <- fitdist(data, distr)
params <- fitg$estimate
print(params) # fitted distribution N(0.0398281, 0.9876068^2) with estimated params
# mean sd
# 0.0398281 0.9876068
mu <- params[1]
sigma <- params[2]
return (rnorm(nsamples, mu, sigma))
}
# handle other distributions here
return (NULL)
}
samples <- fit_and_draw_sample(data, 1000)
hist(data, col=scales::alpha('blue',.2), border=FALSE, main='samples from original and fitted distribution')
hist(samples, col=scales::alpha('red',.2), add=TRUE, border=FALSE)
legend('topright', c("original", "fitted"), col = c(rgb(0,0,1,0.2), rgb(1,0,0,0.2)), lwd=c(2,2))
我使用 fitdistrplus 包中的 fitdist 对我的数据进行(伽玛)分布拟合:
fitg <- fitdist(mdt, "gamma")
结果是描述拟合的参数列表。我想知道是否有一种方法可以使用该结果从该分布创建累积分布函数和随机样本生成器。
例如,如果用 fitdist 拟合的分布对应于均值 0 和 sd 1 的正态分布,我如何轻松地重新创建 pnorm(..,0,1) 和 rnorm(..,0,1) ?
我知道我可以手动完成,但是如果有一个“自动”执行的功能对我来说会容易得多,因为我必须对许多不同的数据集执行此操作,这些数据集将适合不同类型的分布.
非常感谢您的帮助!
你想要下面这样的东西吗?
library(fitdistrplus)
data <- rnorm(1000, 0.01, 1.01) # sampled from original distribution N(0.01, 1.01^2)
fit_and_draw_sample <- function(data, nsamples, distr='norm') {
if (distr == 'norm') {
fitg <- fitdist(data, distr)
params <- fitg$estimate
print(params) # fitted distribution N(0.0398281, 0.9876068^2) with estimated params
# mean sd
# 0.0398281 0.9876068
mu <- params[1]
sigma <- params[2]
return (rnorm(nsamples, mu, sigma))
}
# handle other distributions here
return (NULL)
}
samples <- fit_and_draw_sample(data, 1000)
hist(data, col=scales::alpha('blue',.2), border=FALSE, main='samples from original and fitted distribution')
hist(samples, col=scales::alpha('red',.2), add=TRUE, border=FALSE)
legend('topright', c("original", "fitted"), col = c(rgb(0,0,1,0.2), rgb(1,0,0,0.2)), lwd=c(2,2))