Take the 2-minute tour ×
Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

In functions like NonlinearModelFit I need to specify parameters with a symbol name. If I localize these parameters they get cluttered in the output (e.g."ParameterTable"):

{a, b, c, d} = {2, 30, 4, 0};
data = a PDF[NormalDistribution[b, c], Range@100] + 
   RandomReal[{-.01, .01}, 100];

fitFunc[a_, b_, c_, d_, x_] := a PDF[NormalDistribution[b, c], x] + d

fit[data_] := Module[{a, b, c, d, aStart, nlmf},
  aStart = Max@data;
  nlmf = NonlinearModelFit[data, 
    fitFunc[a, b, c, d, x], {{a, aStart}, {b, 30}, {c, 4}, {d, 0}}, x];
  nlmf["ParameterTable"]
  ]

fit@data

How can I avoid outputs like a$18554 in the the ParameterTable without using global symbol names for the parameters a, b, c, d inside NonlinearModelFit?

share|improve this question
    
Do you care about the actual symbols used or just their appearance in the table? If the latter, you could use the package I posted here along with Block in place of Module. The parameters will all be renamed to things like TransformedParameter$4 but will still display as the original symbols. –  Oleksandr R. Feb 5 '13 at 15:53
1  
Could put the variable names in the input, as fit[data_,vars_] := Module[...] where you then use vars explicitly in the Module. –  Daniel Lichtblau Feb 5 '13 at 15:54
    
Have you considered using Formal Symbols? –  Mr.Wizard Feb 5 '13 at 16:42
1  
Some reasonable starting values to use (instead of the hard-coded ones) are dStart = Min@data; bStart = Position[data, Max@data] // Flatten // Mean; cStart = Max[#] - Min[#] & @ Flatten[Position[data, Alternatives @@ Select[data, 2 (# - dStart ) >= (Max@data - dStart) &]]] /2; aStart = (Max@data - dStart) cStart; –  whuber Feb 5 '13 at 17:03
add comment

1 Answer

up vote 1 down vote accepted

One brute force way is to convert parameters to strings:

fit[data_] := 
  Module[{a, b, c, d, aStart, nlmf}, aStart = Max@data;
      nlmf = NonlinearModelFit[data, fitFunc[a, b, c, d, x], 
            {{a, aStart}, {b, 30}, {c, 4}, {d, 0}}, x];
       nlmf["ParameterTable"] /. {a -> "a", b -> "b", c -> "c", d -> "d"}
  ]
share|improve this answer
    
This is not as elegant as I had hoped. But it is a working solution! Maybe I will ask for a more general solution in another question. Thx! –  grbl Feb 6 '13 at 15:26
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.