00001 #include "TRandom.h"
00002 #include "TGraphErrors.h"
00003 #include "TF1.h"
00004 #include "TCanvas.h"
00005 #include "TLegend.h"
00006
00007 void fitLinearRobust()
00008 {
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 Int_t npoints = 250;
00021 Int_t fraction = Int_t(0.8*npoints);
00022 Double_t *x = new Double_t[npoints];
00023 Double_t *y = new Double_t[npoints];
00024 Double_t *e = new Double_t[npoints];
00025 TRandom r;
00026 Int_t i;
00027 for (i=0; i<fraction; i++){
00028
00029 x[i]=r.Uniform(-2, 2);
00030 e[i]=1;
00031 y[i]=1 + 2*x[i] + 3*x[i]*x[i] + 4*x[i]*x[i]*x[i] + e[i]*r.Gaus();
00032 }
00033 for (i=fraction; i<npoints; i++){
00034
00035 x[i]=r.Uniform(-1, 1);
00036 e[i]=1;
00037 y[i] = 1 + 2*x[i] + 3*x[i]*x[i] + 4*x[i]*x[i]*x[i] + r.Landau(10, 5);
00038 }
00039
00040 TGraphErrors *grr = new TGraphErrors(npoints, x, y, 0, e);
00041 grr->SetMinimum(-30);
00042 grr->SetMaximum(80);
00043 TF1 *ffit1 = new TF1("ffit1", "pol3", -5, 5);
00044 TF1 *ffit2 = new TF1("ffit2", "pol3", -5, 5);
00045 ffit1->SetLineColor(kBlue);
00046 ffit2->SetLineColor(kRed);
00047 TCanvas *myc = new TCanvas("myc", "Linear and robust linear fitting");
00048 myc->SetFillColor(42);
00049 myc->SetGrid();
00050 grr->Draw("ap");
00051
00052 printf("Ordinary least squares:\n");
00053 grr->Fit(ffit1);
00054
00055
00056
00057 printf("Resistant Least trimmed squares fit:\n");
00058
00059
00060
00061
00062
00063
00064 grr->Fit(ffit2, "+rob=0.75");
00065
00066 TLegend *leg = new TLegend(0.6, 0.8, 0.89, 0.89);
00067 leg->AddEntry(ffit1, "Ordinary least squares", "l");
00068 leg->AddEntry(ffit2, "LTS regression", "l");
00069 leg->SetFillColor(42);
00070 leg->Draw();
00071
00072 delete [] x;
00073 delete [] y;
00074 delete [] e;
00075
00076 }