линейная регрессия / линия тренда с графиком мс - PullRequest
1 голос
/ 05 января 2011

У меня есть данные, которые являются числами как по x, так и по y, и я нанес их на график с помощью mschart 4.0

Мне нужно добавить линию тренда / линейную регрессию к куче точек, которые у меня есть. Данные по x и y являются числами (нигде нет дат), например, (33.4,45.1) будет точка.

В примерах, которые я скачал по первой ссылке, я обнаружил образец линейной регрессии в файлах кода прогнозирования.aspx (.cs) и нашел документацию ms *

Я добавил на график линию линейной регрессии со следующей строкой (после того, как все остальные данные были настроены и т. Д.)

Chart1.DataManipulator.FinancialFormula(FinancialFormula.Forecasting, parameters, "Input:Y", "Forecasting:Y,Range:Y,Range:Y2");

Проблема с обоими из них заключается в том, что они предполагают использование дат. Я все равно продолжил и реализовал его, но моя линия регрессии начинается с значения x, равного 20, и переходит к значению x, равному значению max x одной из точек (почти 70), если я задаю параметру Period значение из 700. Но так как он не начинается с значения х 0, я не верю, что это правильно.

Кто-нибудь знает, как это реализовать?

1 Ответ

2 голосов
/ 12 декабря 2011

Мое решение состоит в том, чтобы добавить дополнительную точку данных в начале и конце каждой линии тренда на основе минимального и максимального значений x в диаграмме рассеяния.

Это можно сделать с помощью

  • вычисление наклона линии тренда
  • вычисление пересечения линии тренда
  • получение минимального значения x в диаграмме рассеяния
  • получение максимального значения x в диаграмме рассеяния
  • вычисление минимального значения y с использованием значения наклона, перехвата и минимального значения x
  • вычисление максимального значения y с использованием значения наклона, пересечения и максимального значения x
  • с добавлением двух точекзначения x и y на линии тренда

Следующий фрагмент кода добавляет начальную и конечную точки к двум линиям тренда, за которыми следуют простые функции для вычисления наклона и перехвата:

       if (Chart1.Series["Budget Year"].Points.Count > 2 &&  Chart1.Series["Actual Last Year"].Points.Count > 2)
        {
            Chart1.DataManipulator.FinancialFormula(FinancialFormula.Forecasting, "Linear,0,false,false", Chart1.Series["Budget Year"], Chart1.Series["Trendline (Budget Year)"]);
            Chart1.DataManipulator.FinancialFormula(FinancialFormula.Forecasting, "Linear,0,false,false", Chart1.Series["Actual Last Year"], Chart1.Series["Trendline (Actual Last Year)"]);

            double budgetSlope = Utility.GetSlope(Chart1.Series["Trendline (Budget Year)"].Points[0], Chart1.Series["Trendline (Budget Year)"].Points[1]);
            double lastYearSlope = Utility.GetSlope(Chart1.Series["Trendline (Actual Last Year)"].Points[0], Chart1.Series["Trendline (Actual Last Year)"].Points[1]);
            double budgetIntercept = Utility.GetIntercept(Chart1.Series["Trendline (Budget Year)"].Points[0], Chart1.Series["Trendline (Budget Year)"].Points[1]);
            double lastYearIntercept = Utility.GetIntercept(Chart1.Series["Trendline (Actual Last Year)"].Points[0], Chart1.Series["Trendline (Actual Last Year)"].Points[1]);
            double minBudgetRevenue = Convert.ToDouble(dt.Select("RevCurrBudget = MIN(RevCurrBudget)")[0]["RevCurrBudget"]);
            double maxBudgetRevenue = Convert.ToDouble(dt.Select("RevCurrBudget = MAX(RevCurrBudget)")[0]["RevCurrBudget"]);
            double minLastYearRevenue = Convert.ToDouble(dt.Select("RevPrevActual = MIN(RevPrevActual)")[0]["RevPrevActual"]);
            double maxLastYearRevenue = Convert.ToDouble(dt.Select("RevPrevActual = MAX(RevPrevActual)")[0]["RevPrevActual"]);
            double minBudgetEBIT = (budgetSlope * minBudgetRevenue) + budgetIntercept;
            double maxBudgetEBIT = (budgetSlope * maxBudgetRevenue) + budgetIntercept;
            double minLastYearEBIT = (lastYearSlope * minLastYearRevenue) + lastYearIntercept;
            double maxLastYearEBIT = (lastYearSlope * maxLastYearRevenue) + lastYearIntercept;

            Chart1.Series["Trendline (Budget Year)"].Points.InsertXY(0, minBudgetRevenue, minBudgetEBIT);
            Chart1.Series["Trendline (Budget Year)"].Points.AddXY(maxBudgetRevenue, maxBudgetEBIT);
            Chart1.Series["Trendline (Actual Last Year)"].Points.InsertXY(0, minLastYearRevenue, minLastYearEBIT);
            Chart1.Series["Trendline (Actual Last Year)"].Points.AddXY(maxLastYearRevenue, maxLastYearEBIT);
        }


public static double GetSlope(DataPoint pt1, DataPoint pt2)
{
    return GetSlope(pt1.XValue, pt1.YValues[0], pt2.XValue, pt2.YValues[0]);
}

public static double GetSlope(double x1, double y1, double x2, double y2) 
{
    return (y2 - y1) / (x2 - x1);
}

public static double GetIntercept(DataPoint pt1, DataPoint pt2)
{
    double slope = GetSlope(pt1, pt2);
    double y = pt1.YValues[0];
    double x = pt1.XValue;
    return y - (slope * x);
}
...