fitdist()出错:必须定义dnormal函数

时间:2015-03-29 22:23:23

标签: r

我很难使用fitdist将分布拟合到我的样本数据中。

以下是代码:

fittrial <<- dnorm(severity,mean(severity),var(severity))
fitdist(fittrial,"normal")

我收到此错误:

  

fitdist出错(fittrial,&#34;正常&#34;):         必须定义正常函数

我已经在线查看并尝试过我能理解的一切。我真的很感激我能得到的任何帮助。

2 个答案:

答案 0 :(得分:2)

此答案与使用fitdist包中的fitdistrplus有关,还有其他有用的替代方法,例如fitdistr包中的MASS。从fitdist参数distr的{​​{3}}开始:

  

一个字符串“名称”,用于为其命名   相应的密度函数dname,相应的分布   函数pname和相应的分位数函数qname必须   定义,或者直接定义密度函数。

错误消息的原因是,在R stats包中未定义名为“ normal”的发行版。没有名为dnormal的函数,因此没有错误消息。

但是,有一个名为“ norm”的分布,正确的解决方案是将“ normal”更改为“ norm”,这映射到R stats函数dnorm

> fitdist(c(1,2,3), "normal")
Error in fitdist(c(1, 2, 3), "normal") : 
  The  dnormal  function must be defined

> fitdist(c(1,2,3), "norm")
Fitting of the distribution ' norm ' by maximum likelihood 
Parameters:
      estimate Std. Error
mean 2.0000000  0.4714045
sd   0.8164966  0.3333311

供参考,the documentation

答案 1 :(得分:1)

主要问题是两个类似命名的函数在不同的包中混淆:MASS::fitdistr()(为densfun参数指定&#34;正常&#34;和fitdistrplus::fitdist() (它没有)。有关如何使用fitdistrplus::fitdist()的详细信息,请参阅@ Rakurai的答案;这个答案侧重于MASS::fitdistr()

另外:

  • dnorm()将均值和标准差,而不是均值和方差作为参数。
  • 如果可以避免,请
  • 不要使用<<-赋值运算符。
severity <- 1:10
set.seed(101)  ## for reproducibility
fittrial <- rnorm(length(severity),mean(severity),sd(severity))

library("MASS")

拟合模拟法线偏差:

fitdistr(fittrial,"normal")
##      mean         sd    
##   6.2418957   1.6785684 
##  (0.5308099) (0.3753393)

适合原始数据:

fitdistr(severity,"normal")
##      mean         sd    
##   5.5000000   2.8722813 
##  (0.9082951) (0.6422616)