Требуется рассчитать параметры множественной линейной регрессии методом наименьших квадратов в прямом матричном представлении (например, коэффициенты регрессии, стандартные ошибки, остаточную дисперсию и др.) . Как известно, встроенные в Excel средства – Пакет анализа и функции типа ЛИНЕЙН – работают не более, чем с 16 факторами-регрессорами (по крайней мере в версиях до Office2007), а у меня как минимум десятки факторов (по максимуму – сотни). Поэтому я составил формулу для расчета, например, коэффициента детерминации R^2 множественной линейной регрессии прямым матричным методом, которая вводится в одну ячейку как формула массива
Формула вполне работает с десятками показателей-факторов. Однако, если попытаться "нагрузить" ее естественными проверками корректности входных данных, например таким образом
{=ЕСЛИ(ЧСТРОК(XInput)=ЧСТРОК(YInput);ЕСЛИ(МОПРЕД(МУМНОЖ(ТРАНСП(XInput);XInput))>ЕСЛИ(ЕЧИСЛО(MdetMin);MdetMin;0.01); СУММКВ(МУМНОЖ(XInput;МУМНОЖ(МУМНОЖ(МОБР(МУМНОЖ(ТРАНСП(XInput);XInput));ТРАНСП(XInput));YInput))–СРЗНАЧ(YInput))/СУММКВ(YInput–СРЗНАЧ(YInput));"Исходная матрица факторов X вырождена");"Число строк в данных X и Y не совпадает")}
то Excel начинает ругаться о превышении лимита количества вложенных функций. Вариант "размазать" сложную формулу по нескольким ячейкам по частям не устраивает. Кроме того, если входной столбец YInput передается в формулу непосредственно, как есть, то в соответствии с методом наименьших квадратов к исходной матрице факторов X необходимо слева приписать столбец из единиц, и таким образом, образовать рабочую матрицу XInput, которая подается на вход формулы. А это добавит в структуру данной формулы, как минимум, еще один "этаж", да в нескольких местах. Представляется, что преодолеть эти и другие трудности можно при помощи соответствующей пользовательской функции VBA.
Вопрос. 1) Не встречал ли кто-нибудь готовую (свободную для использования) UDF функцию Excel для расчета параметров множественной линейной регрессии (коэффициент детерминации R^2 и др.), работающую с десятками факторов? (Встроенные функции ЛИНЕЙН и т.п. не годятся – у них число факторов <=16). Если да, то можете ли поделиться ссылкой? 2) Если Вы способны писать на языке VBA так же свободно, как и по-русски, не заглядывая в справочник-словарь, как я, то не могли бы Вы преобразовать приведенные выше формулы в пользовательские функции Excel, которые я мог бы использовать в качестве образца для создания других функций для расчета всех необходимых параметров? На всякий случай, позволю себе привести формулу в более принятом матричном виде
R^2=SUMM[(X(X'X)^(-1)X'Y–Yср)^2]/SUMM[Y–Yср)^2]. Здесь верхний штрих означает транспонирование.
Насколько я знаю, VBA не оперирует матрицами по типу MatLab. Соответственно, если писать собственную функцию исходя из вашей формулы, которая не понятна в смысле определения операции суммирования
Код
R^2=SUMM[(X(X'X)^(-1)X'Y–Yср)^2]/SUMM[Y–Yср)^2] ,
то надо иметь/написать готовые блоки для умножения, транспонирования, нахождения обратной матрицы. Если формула может записана проще без матриц типа вот такого это облегчит программирование. Можно , конечно, воспользоваться формулами листа в VBA для матричных операций типа такого
Код
WorksheetFunction.MInverse(M1)
Правда я не знаю, есть ли ограничения на размерность матриц в этом случае. Если их нет, то вы и сами , пользуясь справочником легко составите нужную вам пользовательскую функцию.
Chonard написал: исходя из вашей формулы, которая не понятна в смысле определения операции суммирования
Извините, споткнувшись о невозможность представления формулы прямо в сообщении попытался изобразить ее в виде смеси матричной и Excel-ной записи. Вот, если интересно, выкладываю картинки формулы в двух вариантах записи – матричной и скалярной. Там верхний штрих означает операцию транспонирования матрицы, прямая черта над переменной – ее среднее значение, а "y с крышкой" – расчетные значения зависимой переменной y . n – это число строк данных.
Chonard написал: вы и сами , пользуясь справочником легко составите нужную вам пользовательскую функцию.
То, что в программе можно непосредственно использовать функции листа, это, конечно, здорово. Хотя наверняка есть какие-то особенности. Например, в локализованной версии (русской) Офиса, когда на листе есть функция МОБР, в программе надо писать МОБР(M1) или MInverse(M1) ? Но, главное замедление вызывают даже не сами функции – именно по справочнику их и можно найти, а то, что пока у меня не набита рука эффективно писать разные обслуживающие операторы, например, "определения" типа Dim, ReDim, и т.д. Поэтому хотелось бы найти где-нибудь готовую функцию, чтобы разобрать "по полочкам" и использовать как образец. Спасибо
justirus, Спасибо за ссылку, очень близко. Плюс хорошо, когда люди не ленятся всюду в теле программы-функции писать множество комментариев. Правда авторы, все время подчеркивают, что их функция только для парной регрессии, то есть для регрессии с одним фактором X. У меня же должны использоваться десятки, а может и сотни факторов. Формулы для расчета параметров множественной линейной регрессии гораздо более громоздки, чем для парной – это не просто добавить всюду встроенные или объемлющие циклы, а совсем другой расчет. Попробую разобраться, но вопрос о готовой функции именно для расчета параметров множественной линейной регрессии не снимается.
ken54 написал: наверняка есть какие-то особенности. Например, в локализованной версии (русской) Офиса, когда на листе есть функция МОБР, в программе надо писать МОБР(M1) или MInverse(M1) ?
Писать надо MInverse(M1). Это можно прочесть в справке. Там же написано, что матрица не более 52х52. При умножении матриц таким способом есть ограничение на общее к-во получающихся ячеек (5641), если правильно помню. Все ограничения можно прочесть в справке по VBA . А чем не нравится Вам первая формула с суммой из вашего рисунка? Ее проще программировать по-моему.
Chonard написал: А чем не нравится Вам первая формула с суммой из вашего рисунка? Ее проще программировать по-моему.
По-видимому, речь идет о второй формуле. Дело в том, что обе формулы в вычислительном смысле одинаково трудны: в той, что Вам приглянулась ("формула с суммой"), присутствуют расчетные значения зависимой переменной ("y с крышкой"), для вычисления которых (точнее, сначала для определения коэффициентов регрессии) понадобятся те же самые матричные операции. Это я как раз и показал в третьей формуле.
Да, думал о второй формуле. Если так все плохо, и в ограничения по размерностям матриц задача не влазит и если оставаться в рамках Excel остается писать функциональные блоки работы с матрицами. Особенно лихо - это обращение матрицы. Может есть специальное ПО под такие задачи?
Chonard, да. Специального ПО много. Просто хотелось сделать все "прозрачно" в Excel. Известный минус всех спецПО в том, что большинство расчетов они делают как в черном ящике – никогда точно неизвестно, как именно они там считают. Часто разные ПО дают разные ответы для одних и тех же данных. Простейший пример, если на каждом шаге некоторого алгоритма происходит разветвление в зависимости от минимального или максимального значения в наборе значений, то если экстремальное значение встречается несколько раз, какое именно выбирают для следующего шага, как правило, неизвестно. Даже если пишут "первое встреченное" (или последнее) – то в каком порядке они были для просмотра, неясно. В Excel можно все определить однозначно, конкретно.
Хотите самописный код в Excel - ваше право, но это не рационально, по-моему. И именно из-за сочинения функциональных блоков для матричной алгебры. В случае вашей задачи я бы присмотрелся все же к MatLab, там сотня строк-столбцов вроде вполне обрабатываются. При этом вы имеете сразу в своем распоряжении весь аппарат матричной алгебры. Прозрачность кода будет обеспечена.