截断的法线由下式给出:
dtnorm<- function(x, mean, sd, a, b) {
dnorm(x, mean, sd)/(pnorm(b, mean, sd)-pnorm(a, mean, sd))
}
ptnorm <- function(x, mean, sd, a, b) {
(pnorm(x,mean,sd) - pnorm(a,mean,sd)) /
(pnorm(b,mean,sd) - pnorm(a,mean,sd))
}
Run Code Online (Sandbox Code Playgroud)
拟合如下:
fitdist( data, tnorm, method="mle",
start=list(mean=mapply("[[", results[1], 1),
sd=mapply("[[", results[1], 2)),
fix.arg=list(a=minLoose,b=maxLoose))
Run Code Online (Sandbox Code Playgroud)
其中results [i]是一个矩阵,其中fitdist的mle结果使用normal而不是tnormal.
我得到以下tnorm的结果:
mean=-0.00844725266454969, sd=0.012540928272073
Run Code Online (Sandbox Code Playgroud)
而与规范:
mean=0.00748402597402597, sd=0.00614293813955003
Run Code Online (Sandbox Code Playgroud)
数据都大于0且小于0.04,因此获得tnorm的mle似乎不正确....任何建议?
谢谢!
您的数据都高于正常值(呃,而不是0以上)这一事实对于最适合截断分布的"均值"是否达到0几乎没有影响.您拟合正态分布的右尾你的数据.截断的估计位置参数实际上不是平均值,而是平均值在未经审查的数据集中,其右尾与您的数据具有相同的密度"形状".(这实际上是一个统计问题而不是R问题.)
您可以在维基百科文章的片刻部分找到计算双重截断法线的期望值的公式:http:
//en.wikipedia.org/wiki/Truncated_normal_distribution它可以很容易地转换成对pnorm和的调用qnorm.
进一步考虑:检查在包中使用截断分布的工具:'gamlss'和'gamlss.tr'.