zkhan - 6 months ago 59

R Question

I'm using the following code to fit the normal distribution. The link for the dataset for "b" (too large to post directly) is :

link for b

`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)

Error in xy.coords(x, y, xlabel, ylabel, log) :

'x' is a list, but does not have components 'x' and 'y'

I get the above error when I try to plot the fitted distribution, and even the summary statistics are off for f1n.

Would appreciate any help.

Answer

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.- I don't know why you load package
`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`
```