目标
查找数据的最佳拟合分布,然后从此分布生成随机数。
示例
使用R中的gamlss
包,我发现最佳拟合分布是"Skew exponential power (Azzalini type 1)"
:
library(gamlss)
library(gamlss.dist)
library(gamlss.add)
m1 <- fitDist(mtcars$wt, k = 2, type = "realAll", trace = FALSE, try.gamlss = TRUE)
summary(m1)
# *******************************************************************
# Family: c("SEP1", "Skew exponential power (Azzalini type 1)")
#
# Call: gamlssML(formula = y, family = DIST[i])
#
# Fitting method: "nlminb"
#
#
# Coefficient(s):
# Estimate Std. Error t value Pr(>|t|)
# eta.mu 3.440000000 0.000149516 23007.56651 < 2e-16
# eta.sigma -1.856665040 0.861826733 -2.15434 0.031214
# eta.nu 0.150728244 NA NA NA
# eta.tau -3.524272086 NA NA NA
#
# eta.mu ***
# eta.sigma *
# eta.nu
# eta.tau
# ---
# Signif. codes:
# 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#
# Degrees of Freedom for the fit: 4 Residual Deg. of Freedom 28
# Global Deviance: -27.4747
# AIC: -19.4747
# SBC: -13.6117
# Warning message:
# In sqrt(diag(object$vcov)) : NaNs produced
错误
但是sigma
和tau
的值是负数,当我把这些值提供给rSEP1()
生成一个随机数时,它抛出了下面的错误:
rSEP1(1, mu = 3.44, sigma = -1.8, nu = 0.15, tau = -3.5)
# Error in rSEP1(1, mu = 3.44, sigma = -1.8, nu = 0.15, tau = -3.5) :
# sigma must be positive
这些值是否已转换?如何为rSEP1()
提供正确的输入?
1条答案
按热度按时间kgsdhlau1#
如果查看参数的链接函数,您将看到:
因此,
fitDist
返回的sigma和tau值是您要插入到rSEP1
中的数字的 log。换句话说,从模型运行rSEP1
的正确方法是:为了证明这一点,我们从定义的
rSEP1
创建一组随机数,其中sigma = 0.5,tau = 0.5。如果我们随后找到最佳拟合分布,我们应该得到sigma和tau都接近log(0.5)的结果。由于log(0.5)
约为-0.69,我们预计这两个参数的值约为-0.69:将sigma和tau的指数代入
dSEP1
,我们可以得到测试向量密度的近乎完美的拟合:值得指出的是,示例中
mtcars$wt
的实际拟合非常糟糕,sigma jyst的值很小,这意味着从分布中提取的大多数随机值将接近mtcars$wt
的均值,数据集中只有32个点,这使得自动精确拟合参数分布非常困难。