Matlab Stepwiselm: Как извлечь переменные из спецификации оптимальной регрессии (т.е. спецификации, минимизирующей BI C)? - PullRequest
1 голос
/ 25 марта 2020

У меня есть набор данных, состоящий из примерно 1800 макропеременных с примерно 350 наблюдениями. Этот набор данных представляет собой матрицу X, дисперсия которой может прогнозировать изменения в кривой доходности казначейства США. Чтобы получить скупость, мы используем 10 первых главных компонентов X для прогнозирования изменений параметров моделируемой кривой доходности (этот метод называется «прогнозирование индекса диффузии»). Тем не менее, мы sh хотим уменьшить размер X, удалив переменные, которые несут незначительную объяснительную силу. Мы делаем это, используя разные пороги. Первый порог основан на индивидуальной значимости каждой отдельной переменной на изменениях кривой доходности (т.е. удаляет каждую переменную с t-stat> 1,65). Этот метод прост, но он игнорирует совместное значение. Следовательно, мы также используем функцию stepwiselm в Matlab с различными критериями, включая минимизацию некоторых информационных критериев (например, BI C) и максимизацию R2 с поправкой. Функция stepwiselm просматривает возможные спецификации модели и выбирает оптимальную спецификацию на основе некоторого критерия.

Проблема с функцией stepwiselm заключается в том, что трудно извлечь переменные из оптимальной спецификации. Скажем, например, что stepwiselm выбирает спецификацию Yt = a + b1X1t + b2X10t + b3X23t. Это означает, что из 1800 переменных в X использование X1, X2 и X23 минимизирует BI C. Затем мы извлечем X1, X2 и X23 так, чтобы мы могли создать новую матрицу X_reduced, столбцы которой состоят из X1, X2 и X23. Затем мы находим Главные Компоненты X_Reduced и используем ПК высшего порядка (с точки зрения дисперсии) для прогноза Yt. В реальной задаче X_Reduced будет состоять из более чем 3 переменных.

Подводя итоги проблемы: Как можно извлечь и сохранить переменные из оптимальной спецификации stepwiselm?

mdl_thresholding = stepwiselm(X, b1_change,...
    'Upper', 'linear', 'Criterion', 'BIC') %Run stepwiselm 
mdl_thresholding.ModelCriterion.BIC %Print the BIC
%Choose variables that minimizes BIC manually, be careful not to include
%the lags of beta1:
i = [8 9 12 15 21 22 24 26 27 28 29 30 33 35 36 38 39 46 49 ...
    58 60 64 65 71 77 78 84 85 87 88 90 91 94 97 98 99 100 ...
    101 102 103 104 106 107 111 117 122 126 127 139 140 ...
    147 153 160 167 183 196 199 202 204 214 216 226 227 ...
    228 236 239 240 243 246 251 255 257 259 264 267 268 ...
    280 281 282 283 288 289 292 295 296 298 302 304 306 ...
    308 310 313 315 316 318 319 321 323 324 325 327 328 ...
    329 332 335 336 337 338 362 372 373 376 378 390 399 ...
    413 414 415 430 445 450 454 459]; %Here I have manually saved the column numbers of the 
%variables chosen by stepwiselm. This is way too time consuming when X becomes larger. 
X_reduced = X(:,i); %Here I extract the chosen variables from X and save them in X_reduced. 
[coeff,score,latent] = pca(X_reduced) %We run PCA on X_reduced

1 Ответ

0 голосов
/ 30 марта 2020

Итак, я нашел способ добиться желаемого результата. Запустив mdl_thresholding .Formula.InModel, я получаю переменную-индикатор, переменные которой функция stepwiselm выбрала для включения в спецификацию оптимальной модели. Затем я использую эту индикаторную переменную для извлечения нужных столбцов из X.

ind = mdl_thresholding.Formula.InModel; %This is an indicator of the variables used in the
%model.
X_reduced = X(:,ind); %Extract the variables from X and obtain X_reduced
...