1

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付近から始まり、パラメータPeriodに値を与えると、ポイントの1つの最大x値(ほぼ70)のx値になります。しかし、それは x 値 0 から始まっていないので、それが正しいとは思えません。

誰でもこれを実装する方法について何か考えがありますか?

4

1 に答える 1

2

私の解決策は、散布図の x の最小値と最大値に基づいて、各傾向線の最初と最後に追加のデータポイントを追加することです。

これは、

  • トレンドラインの傾きを計算する
  • トレンドラインの切片の計算
  • 散布図で x の最小値を取得する
  • 散布図で x の最大値を取得する
  • 勾配、切片、最小 x 値を使用して最小 y 値を計算する
  • 勾配、切片、最大 x 値を使用して最大 y 値を計算する
  • x と y の値を持つ 2 つのポイントをトレンドラインに追加する

次のコード スニペットは、2 つのトレンドラインに始点と終点を追加し、その後に勾配と切片を計算する単純な関数を追加します。

       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);
}
于 2011-12-12T17:52:03.777 に答える