Использование LinEst () в .net - PullRequest
       33

Использование LinEst () в .net

0 голосов
/ 23 ноября 2011

Я хочу использовать встроенную функцию Excel LINEST () для проведения регрессионного анализа в .net. Я могу использовать функцию с квадратным матричным массивом, но когда это не квадратная матрица, скажем, порядка [12,3], то это дает ошибку как:

Ошибка метода LinEst класса WorksheetFunction

Пожалуйста, помогите мне с этим, так как для меня очень важно завершить этот код. Это мой полный код:

        System.Data.DataTable dt = new System.Data.DataTable();
        SqlCommand  cmd =new SqlCommand("Select QtytoTransfer from DEmo ",con);

        SqlDataAdapter adp = new SqlDataAdapter(cmd);
        adp.Fill(dt);

        List<double> yDatapoints =new List<double>();

        foreach (DataRow dr in dt.Rows)
        {
            yDatapoints.Add(Convert.ToDouble( dr["QtytoTransfer"].ToString()));
        }



        System.Data.DataTable dt1 = new System.Data.DataTable();

        SqlCommand sqlcmd = new SqlCommand("Select CurrentQoh,QtySold,GameTime from DEmo ", con);

        SqlDataAdapter adp1 = new SqlDataAdapter(sqlcmd);
        adp1.Fill(dt1);

        double[,] xAll = new double[dt1.Rows.Count, dt1.Columns.Count];
        for (int i = 0; i < dt1.Rows.Count; ++i)
        {
            for (int j = 0; j < dt1.Columns.Count; ++j)
            {
                xAll[i, j] = Convert.ToDouble(dt1.Rows[i][j].ToString());
            }
        }

        Microsoft.Office.Interop.Excel.Application xl = new Microsoft.Office.Interop.Excel.Application();

        Microsoft.Office.Interop.Excel.WorksheetFunction wsf = xl.WorksheetFunction;
        object[,] reslut = (object[,])wsf.LinEst(yDatapoints.ToArray(), xAll, missing, true);

Ответы [ 2 ]

2 голосов
/ 23 ноября 2011

если ваш xAll имеет размерность [12,3], ваша длина yDataPoints должна быть 3 для правильного функционирования LinEst ().

using System;

namespace InteropExcel {
    class Program {
        static void Main(string[] args) {
            Random rand = new Random();
            double[] yDatapoints = new double[3];
            for (int i = 0; i < 3; i++) {
                yDatapoints[i]=rand.Next(20, 60);
            }
            double[,] xAll = new double[12, 3];
            for (int i = 0; i < 12; i++) {
                for (int j = 0; j < 3; j++) {

                    xAll[i, j] = rand.Next(2, 100);
                }
            }
            Microsoft.Office.Interop.Excel.Application xl = new Microsoft.Office.Interop.Excel.Application();
            Microsoft.Office.Interop.Excel.WorksheetFunction wsf = xl.WorksheetFunction;
            object[,] result = (object[,])wsf.LinEst(yDatapoints, xAll, Type.Missing, true);



        }
    }
}

Размер столбца xAll должен быть равен длинемассив yDataPoints.Пожалуйста, попробуйте и дайте мне знать.

0 голосов
/ 17 июля 2019

Вот реализация функции LINEST () в Excel в C #.Это может быть проще, чем создание зависимости от файла DLL Microsoft.Office.Interop.Excel.

Возвращает наклон для данного набора данных, нормализованный с использованием того же метода «наименьших квадратов», что и LINEST ().использует:

public static double CalculateLinest(double[] y, double[] x)
{
   double linest = 0;
   if (y.Length == x.Length)
   {
      double avgY = y.Average();
      double avgX = x.Average();
      double[] dividend = new double[y.Length];
      double[] divisor = new double[y.Length];
      for (int i = 0; i < y.Length; i++)
      {
         dividend[i] = (x[i] - avgX) * (y[i] - avgY);
         divisor[i] = Math.Pow((x[i] - avgX), 2);
      }
      linest = dividend.Sum() / divisor.Sum();
   }
   return linest;
}

Также вот метод, который я написал, чтобы получить значение "b" (y-intercept), которое генерирует функция LINEST в Excel.

private double CalculateYIntercept(double[] x, double[] y, double linest)
{
    return (y.Average() - linest * x.Average());
}

Поскольку эти методы работают толькодля одного набора данных я бы рекомендовал вызывать их внутри цикла, если вы хотите создать несколько наборов данных линейной регрессии.

Эта ссылка помогла мне найти мой ответ: https://agrawalreetesh.blogspot.com/2011/11/how-to-calculate-linest-of-given.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...