I'm using the following code to fit the normal distribution. The link for the dataset for "b" (too large to post directly) is :
setwd("xxxxxx")
library(fitdistrplus)
require(MASS)
tazur <-read.csv("b", header= TRUE, sep=",")
claims<-tazur$b
a<-log(claims)
plot(hist(a))
After plotting the histogram, it seems a normal distribution should fit well.
f1n <- fitdistr(claims,"normal")
summary(f1n)
#Length Class Mode
#estimate 2 -none- numeric
#sd 2 -none- numeric
#vcov 4 -none- numeric
#n 1 -none- numeric
#loglik 1 -none- numeric
plot(f1n)
But when I try to plot the fitted distribution, I get
Error in xy.coords(x, y, xlabel, ylabel, log) :
'x' is a list, but does not have components 'x' and 'y'
and even the summary statistics are off for f1n.
Any ideas?
Looks like you are making confusion between MASS::fitdistr
and fitdistrplus::fitdist
.
MASS::fitdistr
returns object of class "fitdistr", and there is no plot method for this. So you need to extract estimated parameters and plot the estimated density curve yourself.fitdistrplus
, because your function call clearly shows you are using MASS
. Anyway, fitdistrplus
has function fitdist
which returns object of class "fitdist". There is plot method for this class, but it won't work for "fitdistr" returned by MASS
.I will show you how to work with both packages.
## reproducible example
set.seed(0); x <- rnorm(500)
Using MASS::fitdistr
No plot method is available, so do it ourselves.
library(MASS)
fit <- fitdistr(x, "normal")
class(fit)
# [1] "fitdistr"
para <- fit$estimate
# mean sd
#-0.0002000485 0.9886248515
hist(x, prob = TRUE)
curve(dnorm(x, para[1], para[2]), col = 2, add = TRUE)
Using fitdistrplus::fitdist
library(fitdistrplus)
FIT <- fitdist(x, "norm") ## note: it is "norm" not "normal"
class(FIT)
# [1] "fitdist"
plot(FIT) ## use method `plot.fitdist`