MathGroup Archive 2006

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Best linear Fit to slope data with Fixed starting point/value.

  • To: mathgroup at smc.vnet.net
  • Subject: [mg63592] Re: Best linear Fit to slope data with Fixed starting point/value.
  • From: "Ray Koopman" <koopman at sfu.ca>
  • Date: Fri, 6 Jan 2006 05:24:40 -0500 (EST)
  • References: <dpg13b$pmj$1@smc.vnet.net>
  • Sender: owner-wri-mathgroup at wolfram.com

Lea Rebanks wrote:
> Given the list below, (quite large - 4516 points), is when plotted an
> almost perfect straight line with noise.
>
> I want to plot the best linear fit (i.e. m*x + b) to this data, however
> I must retain the original first value (151.0993767999595).
>
> Obviously I could do this manually, but was wondering if there was a
> more accurate & efficient way using Mathematica.
>
> Many thanks for your attention.
>
> Best Regards - Lea Rebanks...
>
>
> Data below:-
>
> { (* data omitted *) }

Why are there only 1929 points, instead of 4516 ?

In[1]:= n = Length[y = { (* data omitted *) }]
Out[1]= 1929

This data set requires careful analysis. The purpose of the many
"InputForm"s in the following is to force all the digits to print.

f is the usual unconstrained least-squares fit.
r is the corresponding residual vector,
followed by some descriptive statistics.
Mean, Min, & Max ought to be zero, negative, & positive, respectively.

In[2]:= {f = Fit[y,{1,x},x], r = y - Table[f,{x,n}];
 r[[1]], Mean@r, Min@r, Max@r, r.r} //InputForm

Out[2]//InputForm=
{151.0405970247262 + 0.05877977523343556*x,
 -1.4210854715202004*^-13, -1.6650789957127822*^-13,
 -2.2737367544323206*^-13, -1.4210854715202004*^-13,
 5.425222374968153*^-23}

f0 is a least-squares fit, constrained to pass thru {1,y[[1]]}.
r0 is the corresponding residual vector,
followed by the same descriptive statistics as for r.
r0[[1]] ought to be zero, and r0.r0 ought to be greater than r.r .

In[3]:= {f0 = y[[1]] + Fit[y-y[[1]],{x-1},x], r0 = y - Table[f0,{x,n}];
 r0[[1]], Mean@r0, Min@r0, Max@r0, r0.r0} //InputForm

Out[3]//InputForm=
{151.0993767999595 + 0.05877977523343556*(-1 + x),
 0., -2.1305231641453703*^-14,
-1.1368683772161603*^-13, 0.,
 1.5832753912147795*^-24}

f & f0 differ only in their intercepts.

In[4]:= Simplify[f - f0] //InputForm
Out[4]//InputForm= 1.4519635493925875*^-13 + 0.*x

Doing everything in double precision gives better results.

In[5]:= yy = SetPrecision[y,2*$MachinePrecision];
{ff = Fit[yy,{1,x},x], rr = yy - Table[ff,{x,n}];
 rr[[1]], Mean@rr, Min@rr, Max@rr, rr.rr} //N//InputForm

Out[6]//InputForm=
{151.04059702472605 + 0.05877977523343554*x,
 2.0177667765604405*^-15, 0.,
-4.916104707204294*^-14, 3.285806817257583*^-14,
 2.475826245403202*^-25}

In[7]:= {ff0 = yy[[1]] + Fit[yy-yy[[1]],{x-1},x],
 rr0 = yy - Table[ff0,{x,n}];
 rr0[[1]], Mean@rr0, Min@rr0, Max@rr0, rr0.rr0} //N//InputForm

Out[7]//InputForm=
{151.0993767999595 + 0.05877977523343554*(-1. + x),
 0., -5.048340522117773*^-16,
-4.833186368058629*^-14, 3.3630752001712404*^-14,
 2.4954757604292457*^-25}

In[8]:= Simplify[ff - ff0] //N//InputForm
Out[8]//InputForm= -2.019336208847109*^-15 + 1.5694322866687375*^-18*x

y appears to be quantized,
with more noise at the top than at the bottom.

In[9]:= y1 = ListConvolve[{1,-1},y];
ListPlot[y1,PlotRange->All,Frame->True,Axes->None];
g = {#[[1]],Length@#}& /@ Split@Reverse@Sort@y1;
TableForm[{InputForm@#[[1]],#[[2]]}&/@g]

Out[12]//TableForm= 0.058779775233460896   280
                    0.058779775233432474   1577
                    0.05877977523340405    70
                    0.05877977523337563    1

In[13]:= y2 = ListConvolve[{1,-1},y1];
ListPlot[y2,PlotRange->All,Frame->True,Axes->None];
h = {#[[1]],Length@#}& /@ Split@Reverse@Sort@y2;
TableForm[{InputForm@#[[1]],#[[2]]}&/@h]

Out[16]//TableForm= 8.526512829121202*^-14   1
                    5.684341886080802*^-14   70
                    2.842170943040401*^-14   192
                    0.                       1402
                   -2.842170943040401*^-14   191
                   -5.684341886080802*^-14   70
                   -8.526512829121202*^-14   1

In[17]:= ( g[[All,1]] - g[[2,1]] ) / h[[3,1]] //InputForm
Out[17]//InputForm= {1., 0., -1., -2.}

In[18]:= {y===Sort@y, m = (n+1)/2, y[[m]], Mean@y - y[[m]]} //InputForm
Out[18]//InputForm= {True, 965, 207.76308012499135, 0.}

In[19]:= z = y - y[[m]]; z[[m]]
k = {#[[1]],Length@#}& /@ Split@Reverse@Sort@Drop[z + Reverse@z, m];
TableForm[{InputForm@#[[1]],#[[2]]}&/@k]

Out[19]= 0.
Out[21]//TableForm= 2.842170943040401*^-14   95
                    0.                       766
                   -2.842170943040401*^-14   76
                   -5.684341886080802*^-14   27

In[22]:= k[[1,1]] === h[[3,1]]
Out[22]= True

Is 2.842170943040401*^-14 some sort of quantum number?


  • Prev by Date: Re: Evaluating x^0
  • Next by Date: Re: Re: Re: Re: Questions regarding MatrixExp, and its usage
  • Previous by thread: Re: Best linear Fit to slope data with Fixed starting point/value.
  • Next by thread: Re: Best linear Fit to slope data with Fixed starting point/value.