Страницы: 1
RSS
Нужна функция расчета R^2 множественной линейной регрессии с числом факторов > 16 (как у ЛИНЕЙН), преобразовать имеющуюся формулу в UDF функцию
 
Требуется рассчитать параметры множественной линейной регрессии методом наименьших квадратов в прямом матричном представлении (например, коэффициенты регрессии, стандартные ошибки, остаточную дисперсию и др.) .
Как известно, встроенные в Excel средства – Пакет анализа и функции типа ЛИНЕЙН – работают не более, чем с 16 факторами-регрессорами (по крайней мере в версиях до Office2007), а у меня как минимум десятки факторов (по максимуму – сотни).
Поэтому я составил формулу для расчета, например, коэффициента детерминации R^2 множественной линейной регрессии прямым матричным методом, которая вводится в одну ячейку как формула массива

{=СУММКВ(МУМНОЖ(XInput;МУМНОЖ(МУМНОЖ(МОБР(МУМНОЖ(ТРАНСП(XInput);XInput));ТРАНСП(XInput));YInput))–СРЗНАЧ(YInput))/СУММКВ(YInput–СРЗНАЧ(YInput))}

Формула вполне работает с десятками показателей-факторов. Однако, если попытаться "нагрузить" ее естественными проверками корректности входных данных, например таким образом

{=ЕСЛИ(ЧСТРОК(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].    Здесь верхний штрих означает транспонирование.

Спасибо
Изменено: ken54 - 18.11.2015 22:14:53
 
Насколько я знаю, VBA  не оперирует матрицами по типу MatLab. Соответственно, если писать собственную функцию исходя из вашей формулы, которая не понятна в смысле определения операции суммирования
Код
R^2=SUMM[(X(X'X)^(-1)X'Y–Yср)^2]/SUMM[Y–Yср)^2] ,
то надо иметь/написать готовые блоки для умножения, транспонирования, нахождения обратной матрицы. Если формула может записана проще без матриц типа   вот такого это облегчит программирование. Можно , конечно, воспользоваться формулами листа в VBA для матричных операций  типа такого
Код
WorksheetFunction.MInverse(M1)
Правда я не знаю, есть ли ограничения на размерность матриц в этом случае. Если их нет, то вы и сами , пользуясь справочником легко составите нужную вам пользовательскую функцию.  
Изменено: Chonard - 18.11.2015 23:28:00
 
Цитата
Chonard написал:
исходя из вашей формулы, которая не понятна в смысле определения операции суммирования
Извините, споткнувшись о невозможность представления формулы прямо в сообщении попытался изобразить ее в виде смеси матричной и Excel-ной записи.
Вот, если интересно, выкладываю картинки формулы в двух вариантах записи –  матричной и скалярной. Там верхний штрих означает операцию транспонирования матрицы, прямая черта над переменной – ее среднее значение, а "y с крышкой" – расчетные значения зависимой переменной  y . n – это число строк данных.
Изменено: ken54 - 19.11.2015 16:31:24
 
Цитата
Chonard написал:
вы и сами , пользуясь справочником легко составите нужную вам пользовательскую функцию.
То, что в программе можно непосредственно использовать функции листа, это, конечно, здорово. Хотя наверняка есть какие-то особенности. Например, в локализованной версии (русской) Офиса, когда на листе есть функция МОБР, в программе надо писать МОБР(M1) или  MInverse(M1) ?
Но, главное замедление вызывают даже не сами функции – именно по справочнику их и можно найти, а то, что пока у меня не набита рука эффективно писать разные обслуживающие операторы, например, "определения" типа Dim, ReDim, и т.д.
Поэтому хотелось бы найти где-нибудь готовую функцию, чтобы разобрать "по полочкам" и использовать как образец.
Спасибо
 
Вот здесь есть UDF для своей функции ЛИНЕЙН, оно?
 
justirus, Спасибо за ссылку, очень близко. Плюс хорошо, когда люди не ленятся всюду в теле программы-функции писать множество комментариев.
Правда авторы, все время подчеркивают, что их функция только для парной регрессии, то есть для регрессии
с одним фактором X. У меня же должны использоваться десятки, а может и сотни факторов.
Формулы для расчета параметров множественной линейной регрессии гораздо более громоздки, чем для парной – это не просто добавить всюду встроенные или объемлющие циклы, а совсем другой расчет.
Попробую разобраться, но вопрос о готовой функции именно для расчета параметров множественной линейной регрессии не снимается.
Изменено: ken54 - 19.11.2015 15:49:19
 
Цитата
ken54 написал:
наверняка есть какие-то особенности. Например, в локализованной версии (русской) Офиса, когда на листе есть функция МОБР, в программе надо писать МОБР(M1) или  MInverse(M1) ?
Писать надо MInverse(M1). Это можно прочесть в справке. Там же написано, что матрица не более 52х52. При умножении матриц таким способом есть ограничение на общее к-во получающихся ячеек (5641), если правильно помню. Все ограничения можно прочесть в справке по VBA . А чем не нравится Вам первая формула с суммой из вашего рисунка? Ее проще программировать по-моему.
 
Цитата
Chonard написал:
А чем не нравится Вам первая формула с суммой из вашего рисунка? Ее проще программировать по-моему.
По-видимому, речь идет о второй формуле. Дело в том, что обе формулы в вычислительном смысле одинаково трудны: в той, что Вам приглянулась ("формула с суммой"), присутствуют расчетные значения зависимой переменной ("y с крышкой"), для вычисления которых (точнее, сначала для определения коэффициентов регрессии) понадобятся те же самые матричные операции. Это я как раз и показал в третьей формуле.  
 
Да, думал о второй формуле.  Если так все плохо, и в ограничения по размерностям матриц задача не влазит и если оставаться в рамках Excel остается писать функциональные блоки работы с матрицами. Особенно лихо - это обращение матрицы. Может есть специальное ПО под такие задачи?
 
Chonard, да. Специального ПО много. Просто хотелось сделать все "прозрачно" в Excel. Известный минус всех спецПО в том, что большинство расчетов они делают как в черном ящике – никогда точно неизвестно, как именно они там считают. Часто разные ПО дают разные ответы для одних и тех же данных. Простейший пример, если на каждом шаге некоторого алгоритма происходит разветвление в зависимости от минимального или максимального значения в наборе значений, то если экстремальное значение встречается несколько раз, какое именно выбирают для следующего шага, как правило, неизвестно. Даже если пишут "первое встреченное" (или последнее) – то в каком порядке они были для просмотра, неясно. В Excel можно все определить однозначно, конкретно.
Изменено: ken54 - 19.11.2015 21:27:21
 
Хотите самописный код в Excel - ваше право, но это не рационально, по-моему. И именно из-за сочинения функциональных блоков для матричной алгебры. В случае вашей задачи я бы присмотрелся все же к MatLab, там сотня строк-столбцов вроде вполне  обрабатываются. При этом вы имеете сразу в своем распоряжении весь аппарат матричной алгебры. Прозрачность кода будет обеспечена.  
Изменено: Chonard - 20.11.2015 00:04:30
 
Цитата
Chonard написал:
В случае вашей задачи я бы присмотрелся все же к MatLab
Спасибо за совет. Еще кто-то предложил R. Есть еще SPSS, Statistica и т.д. В общем, по-видимому, придется отходить от Excel.
А жаль...
Изменено: ken54 - 20.11.2015 16:51:31
 
Цитата
Chonard написал: Хотите самописный код в Excel
Да именно НЕ самописный – хотелось бы готовую проверенную функцию.
Страницы: 1
Читают тему
Наверх