Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I calculate a trendline for a graph?

Tags:

c#

math

graph

Google is not being my friend - it's been a long time since my stats class in college...I need to calculate the start and end points for a trendline on a graph - is there an easy way to do this? (working in C# but whatever language works for you)

like image 225
matt Avatar asked Sep 04 '08 05:09

matt


People also ask

How does excel calculate trendline equation?

The Excel TREND function calculates the linear trend line through a given set of y-values and (optionally), a given set of x-values. The function then extends the linear trendline to calculate additional y-values for a further supplied set of new x-values. An array known y-values. One or more arrays of known x-values.


2 Answers

Thanks to all for your help - I was off this issue for a couple of days and just came back to it - was able to cobble this together - not the most elegant code, but it works for my purposes - thought I'd share if anyone else encounters this issue:

public class Statistics {     public Trendline CalculateLinearRegression(int[] values)     {         var yAxisValues = new List<int>();         var xAxisValues = new List<int>();          for (int i = 0; i < values.Length; i++)         {             yAxisValues.Add(values[i]);             xAxisValues.Add(i + 1);         }          return new Trendline(yAxisValues, xAxisValues);     } }  public class Trendline {     private readonly IList<int> xAxisValues;     private readonly IList<int> yAxisValues;     private int count;     private int xAxisValuesSum;     private int xxSum;     private int xySum;     private int yAxisValuesSum;      public Trendline(IList<int> yAxisValues, IList<int> xAxisValues)     {         this.yAxisValues = yAxisValues;         this.xAxisValues = xAxisValues;          this.Initialize();     }      public int Slope { get; private set; }     public int Intercept { get; private set; }     public int Start { get; private set; }     public int End { get; private set; }      private void Initialize()     {         this.count = this.yAxisValues.Count;         this.yAxisValuesSum = this.yAxisValues.Sum();         this.xAxisValuesSum = this.xAxisValues.Sum();         this.xxSum = 0;         this.xySum = 0;          for (int i = 0; i < this.count; i++)         {             this.xySum += (this.xAxisValues[i]*this.yAxisValues[i]);             this.xxSum += (this.xAxisValues[i]*this.xAxisValues[i]);         }          this.Slope = this.CalculateSlope();         this.Intercept = this.CalculateIntercept();         this.Start = this.CalculateStart();         this.End = this.CalculateEnd();     }      private int CalculateSlope()     {         try         {             return ((this.count*this.xySum) - (this.xAxisValuesSum*this.yAxisValuesSum))/((this.count*this.xxSum) - (this.xAxisValuesSum*this.xAxisValuesSum));         }         catch (DivideByZeroException)         {             return 0;         }     }      private int CalculateIntercept()     {         return (this.yAxisValuesSum - (this.Slope*this.xAxisValuesSum))/this.count;     }      private int CalculateStart()     {         return (this.Slope*this.xAxisValues.First()) + this.Intercept;     }      private int CalculateEnd()     {         return (this.Slope*this.xAxisValues.Last()) + this.Intercept;     } } 
like image 89
matt Avatar answered Oct 16 '22 18:10

matt


OK, here's my best pseudo math:

The equation for your line is:

Y = a + bX

Where:

b = (sum(x*y) - sum(x)sum(y)/n) / (sum(x^2) - sum(x)^2/n)

a = sum(y)/n - b(sum(x)/n)

Where sum(xy) is the sum of all x*y etc. Not particularly clear I concede, but it's the best I can do without a sigma symbol :)

... and now with added Sigma

b = (Σ(xy) - (ΣxΣy)/n) / (Σ(x^2) - (Σx)^2/n)

a = (Σy)/n - b((Σx)/n)

Where Σ(xy) is the sum of all x*y etc. and n is the number of points

like image 34
blank Avatar answered Oct 16 '22 17:10

blank