For some reason fitdistr() does not seem to be passing on the "..."
argument "lower" to optim() in the proper manner, and as result
falls over.
Here is my example; note that data are attached in the file "x.txt".
dhse <- function(i,alpha,beta,topn) {
x <- seq(0,1,length=topn+2)[-c(1,topn+2)]
p <- dbeta(x,alpha,beta)
if(any(!is.finite(p))) browser()
(p/sum(p))[i]
}
lwr <- rep(sqrt(.Machine$double.eps),2)
par0 <- c(alpha=1.010652,beta=1.929018)
x <- dget("x.txt")
fit <- MASS::fitdistr(x,densfun=dhse,topn=5,start=as.list(par0),
lower=lwr)
The browser() in dhse() allows you to see that alpha has gone negative,
taking a value:
alpha
-0.001999985
Continuing causes fitdistr() to fall over with the error message:
If I eschew using fitdistr() and "roll-my-own" as follows:
foo <- function(par,x,topn){-sum(log(dhse(i=x,alpha=par[1],
beta=par[2],
topn=topn)))}
fit <- optim(par0,fn=foo,method="L-BFGS-B",lower=lwr,topn=5,x=x)
then optim() returns a result without complaint.
Am I somehow messing up the syntax for fitdistr()?
cheers,
Rolf Turner
P. S. I've tried supplying the "method" argument, method="L-BFGS-B"
explicitly to fitdistr(); doesn't seem to help.
R.T.