[R-sig-finance] Distribution Fitting
Lorenzo Isella
lorenzo.isella at gmail.com
Mon Apr 24 17:19:33 CEST 2006
On Mon, 2006-04-24 at 15:08 +0200, Martin Maechler wrote:
> >>>>> "Lorenzo" == Lorenzo Isella <lorenzo.isella at gmail.com>
> >>>>> on Mon, 24 Apr 2006 00:10:41 +0200 writes:
>
> Lorenzo> Dear All,
> Lorenzo> I am experiencing some problems in fitting a trimodal distribution (which
> Lorenzo> should be thought as a sum of three Gaussian distributions) using the nls
> Lorenzo> function for nonlinear fittings.
> Lorenzo> As a test, just consider the very simple code:
>
> Lorenzo> rm(list=ls());
> Lorenzo> mydata<-rnorm(10000,0,4);
> Lorenzo> mydens<-density(mydata,kernel="gaussian");
> Lorenzo> y1<-mydens$y;
> Lorenzo> x1<-mydens$x;
> Lorenzo> myfit<-nls(y1~A*exp(-x1^2/sig));
>
> (it's slightly inefficient and completely unnecessary to append
> an empty statement to every line -- which you
> do incidentally if you add superfluous ';' at end of lines )
>
>
> Lorenzo> which I use to get the empirical density (as I would from real experimental
> Lorenzo> data) and test it against a Gaussian ansatz.
> Lorenzo> Well, either R always crashes for a segmentation fault and I have to restart
> Lorenzo> it manually or I get this output:
>
> Lorenzo> Error in match.call(definition, call, expand.dots) :
> Lorenzo> '.Primitiv�i�d�������������...' is not a function
>
> I cannot confirm any segmentation fault (and if you really get
> them, indeed your R *installation* is buggy (or outdated)), but
> indeed, you've revealed a buglet in nls() - which is still
> present in R 2.3.0 which has been released a few hours ago.
> Thank you for reporting it as a reproducible example!
>
> I'm going to try to fix the bug.
>
> Lorenzo> Am I missing the obvious or is there some bug in my R build?
>
> As others have said (implicitly): you're missing the facts
>
> - that it's rather bad idea to fit "data" to a density estimate.
> - if your density has a closed from, you should rather use
> maximum likelihood, typically most easily via MASS::fitdistr
>
> Martin
Thanks everybody for their advice.
Granted that I had better use fitdistr for my particular problem, how do
I feed a particular density function of my own choice into it?
E.g., consider the case of Gaussian-distributed data and suppose there
is no "normal" argument for the fitdistr().
mysample<-rnorm(10000,2,4)
You want to model the data as drawn from the probability distribution
A*exp(-(x-mu)^2/sig), where x is an experimental data and have A, mu and
sigma as parameters to fit.
I read the help(fitdistr) page, but there is not an example with a
user-provided probability density and I did not get very far with my
attempts.
Best regards and thanks in advance for your help
Lorenzo
More information about the R-sig-finance
mailing list