# Trying to Find the Slope Fit of A Log Log Plot

I need to find the linear slope on a log log plot for small values x and for large values of x, but I am not sure how. You can only fit data right, so how do I tell it to fit a log log plot? Here is my graph and my data:

 MuhData={{0.7366, 0.238124}, {1.016, 0.844452}, {1.4732, 2.30787}, {1.938,
4.91981}, {0.3048, 0.00808025}, {0.5131, 0.0588889}};
loglogstuff =
ListLogLogPlot[{MuhData},
PlotTheme -> "Scientific",
PlotMarkers -> {{\[FilledSquare], 15}}, PlotStyle -> {Blue},
PlotLegends ->
PointLegend[Automatic, {"Large"},
LegendFunction -> Frame]]


If I get a linear fit for small values it tells me the power relationship and same for large values. Somehow I need to find 1 fit for each (small values and large values of x) and it needs to be linear. Any help on how to do this is appreciated.

LogLogPlot just takes the Log of the data and provides some neat formatting of the axes:

GraphicsRow[{ListLogLogPlot[MuhData, Frame -> True],
ListPlot[Log[MuhData], Frame -> True]}, ImageSize -> 600]


So you can just fit a line to the Log of the data:

lm = LinearModelFit[Log[MuhData], x, x];
Normal[lm]


-0.498215 + 3.49921 x

Show[Plot[Normal@lm, {x, -1.5, 1}, PlotStyle -> Red, Frame -> True], loglogstuff]


f0 = Normal[lm] /. x -> Log[x] // Exp


0.607614 x^3.49921

Show[LogLogPlot[f0, {x, 0.2, 2}, PlotStyle -> Red, Frame -> True], loglogstuff]


EDIT:

To fit separately for small and large x values I'd Take, according to the comment of OP, the first two and last two points and do separate fits:

lm1 = LinearModelFit[Take[Log@MuhData, 2], x, x]
Normal[lm1]


-0.231552 + 3.93645 x

lm2 = LinearModelFit[Take[Log@MuhData, -2], x, x]
Normal[lm2]


-0.287282 + 3.8137 x

Show[Plot[Normal@lm1, {x, -1.5, 0}, PlotStyle -> Red, Frame -> True],
Plot[Normal@lm2, {x, 0, 1}, PlotStyle -> Blue,
Frame -> True], loglogstuff, PlotRange -> All]


Or

f1 = Normal[lm1] /. x -> Log[x] // Exp
f2 = Normal[lm2] /. x -> Log[x] // Exp

Show[LogLogPlot[f1, {x, 0.3, 1}, PlotStyle -> Red, Frame -> True],
LogLogPlot[f2, {x, 1, 2}, PlotStyle -> Blue,
Frame -> True], loglogstuff, PlotRange -> All]


A bit more general: if one defines "small x" such that x<1, and "large" as x>1, then one can Select the data for respective fits:

lm3 = LinearModelFit[Log@Select[MuhData, #[[1]] < 1 &], x, x]
Normal[lm3]


-0.267396 + 3.83288 x

lm4 = LinearModelFit[Log@Select[MuhData, #[[1]] > 1 &], x, x]
Normal[lm4]


-0.214781 + 2.72766 x

Show[Plot[Normal@lm3, {x, -1.5, 0}, PlotStyle -> Red, Frame -> True],
Plot[Normal@lm4, {x, 0, 1}, PlotStyle -> Blue,
Frame -> True], loglogstuff, PlotRange -> All]


Or

f3 = Normal[lm3] /. x -> Log[x] // Exp
f4 = Normal[lm4] /. x -> Log[x] // Exp

Show[LogLogPlot[f3, {x, 0.3, 1}, PlotStyle -> Red, Frame -> True],
LogLogPlot[f4, {x, 1, 2}, PlotStyle -> Blue,
Frame -> True], loglogstuff, PlotRange -> All]


• what about the issue of finding 2 fits, one for small x and one for large x? Oct 12, 2016 at 18:00
• What are "small" and "large"? The division is not very clear from the loglogplot. Oct 12, 2016 at 18:03
• True, I define small as the first two points lets say and large as the last two points Oct 12, 2016 at 18:04
• @Shrodinger2016. You have no business getting 2 fits with just 6 data points. (Plus, the linear fit doesn't seem to be too bad.)
– JimB
Oct 12, 2016 at 18:08
• These data points are averages of 10 trials each, and I am expected to have two power law relationships. Don't blame me, blame my class for not giving me more supplies. Oct 12, 2016 at 18:10
ft = Fit[Log@MuhData, {1, x}, x] /. x -> Log[x] // Exp

Show[ListLogLogPlot[{MuhData}, PlotTheme -> "Scientific",
PlotMarkers -> {{\[FilledSquare], 15}}, PlotStyle -> {Blue},
PlotLegends ->
PointLegend[Automatic, {"Large"}, LegendFunction -> Frame]],
LogLogPlot[ft, {x, 0.3, 2.0}, PlotStyle -> Red, PlotRange -> Full]]