exponenta event banner

Нелинейная регрессия

Что такое параметрические нелинейные регрессионные модели?

Параметрические нелинейные модели представляют взаимосвязь между переменной непрерывного ответа и одной или несколькими переменными непрерывного предиктора в форме

y = f (X, β) +

где

  • y - вектор n-на-1 наблюдений переменной отклика.

  • f - любая функция X и β, которая оценивает каждую строку X вместе с вектором β, чтобы вычислить предсказание для соответствующей строки y.

  • X является матрицей n-за-p предикторов, с одной строкой для каждого наблюдения и одним столбцом для каждого предиктора.

  • β - вектор p-by-1 неизвестных параметров, подлежащих оценке.

  • λ - вектор n-на-1 независимых, одинаково распределенных случайных возмущений.

Напротив, непараметрические модели не пытаются охарактеризовать взаимосвязь между предикторами и ответом с параметрами модели. Описания часто являются графическими, как в случае деревьев решений.

fitnlm пытается найти значения параметров β, которые минимизируют среднеквадратичные различия между наблюдаемыми ответами y и предсказаниями модели f (X, β). Для этого требуется начальное значениеbeta0 перед итеративной модификацией вектора β в вектор с минимальной среднеквадратичной ошибкой.

Подготовка данных

Чтобы начать подгонку регрессии, поместите данные в форму, ожидаемую для подгонки функций. Все методы регрессии начинаются с входных данных в массиве X и данные ответа в отдельном векторе yили входные данные в таблице или массиве наборов данных tbl и данные ответа в виде столбца в tbl. Каждая строка входных данных представляет одно наблюдение. Каждый столбец представляет один предиктор (переменную).

Для таблицы или массива наборов данных tbl, укажите переменную ответа с помощью 'ResponseVar' пара имя-значение:

mdl = fitlm(tbl,'ResponseVar','BloodPressure');

Переменная ответа является последним столбцом по умолчанию.

Нельзя использовать категориальные предикторы для нелинейной регрессии. Категориальный предиктор - это тот, который берет значения из фиксированного набора возможностей.

Представить отсутствующие данные как NaN как для входных данных, так и для данных ответа.

Массив наборов данных для входных и ответных данных

Например, чтобы создать массив наборов данных из электронной таблицы Excel ®:

ds = dataset('XLSFile','hospital.xls',...
    'ReadObsNames',true);

Чтобы создать массив наборов данных из переменных рабочей области, выполните следующие действия.

load carsmall
ds = dataset(Weight,Model_Year,MPG);

Таблица входных и ответных данных

Чтобы создать таблицу из электронной таблицы Excel, выполните следующие действия.

tbl = readtable('hospital.xls',...
    'ReadRowNames',true);

Чтобы создать таблицу из переменных рабочей области, выполните следующие действия.

load carsmall
tbl = table(Weight,Model_Year,MPG);

Числовая матрица для входных данных и числовой вектор для ответа

Например, чтобы создать числовые массивы из переменных рабочей области:

load carsmall
X = [Weight Horsepower Cylinders Model_Year];
y = MPG;

Чтобы создать числовые массивы из электронной таблицы Excel, выполните следующие действия.

[X, Xnames] = xlsread('hospital.xls');
y = X(:,4); % response y is systolic pressure
X(:,4) = []; % remove y from the X matrix

Обратите внимание, что нечисловые записи, такие как sex, не появляться в X.

Представление нелинейной модели

Существует несколько способов представления нелинейной модели. Используйте все, что наиболее удобно.

Нелинейная модель является обязательным входом для fitnlm, в modelfun вход.

fitnlm предполагает, что функция отклика f (X, β) является гладкой в параметрах β. Если ваша функция не плавна,fitnlm может не обеспечить оптимальные оценки параметров.

Дескриптор функции для анонимной функции или файла функции

Дескриптор функции @modelfun(b,x) принимает вектор b и матрица, таблица или массив наборов данных x. Дескриптор функции должен возвращать вектор f с тем же количеством строк, что и x. Например, файл функции hougen.m вычисляет

hougen (b, x) = b (1) x (2) x (3 )/b (5) 1 + b (2) x (1) + b (3) x (2) + b (4) x (3).

Проверьте функцию путем ввода type hougen в командной строке MATLAB ®.

function yhat = hougen(beta,x)
%HOUGEN Hougen-Watson model for reaction kinetics.
%   YHAT = HOUGEN(BETA,X) gives the predicted values of the
%   reaction rate, YHAT, as a function of the vector of 
%   parameters, BETA, and the matrix of data, X.
%   BETA must have 5 elements and X must have three
%   columns.
%
%   The model form is:
%   y = (b1*x2 - x3/b5)./(1+b2*x1+b3*x2+b4*x3)
%
%   Reference:
%      [1]  Bates, Douglas, and Watts, Donald, "Nonlinear
%      Regression Analysis and Its Applications", Wiley
%      1988 p. 271-272.

%   Copyright 1993-2004 The MathWorks, Inc. 
%   B.A. Jones 1-06-95.

b1 = beta(1);
b2 = beta(2);
b3 = beta(3);
b4 = beta(4);
b5 = beta(5);

x1 = x(:,1);
x2 = x(:,2);
x3 = x(:,3);

yhat = (b1*x2 - x3/b5)./(1+b2*x1+b3*x2+b4*x3);

Можно написать анонимную функцию, которая выполняет тот же расчет, что и hougen.m.

modelfun = @(b,x)(b(1)*x(:,2) - x(:,3)/b(5))./...
(1 + b(2)*x(:,1) + b(3)*x(:,2) + b(4)*x(:,3));

Текстовое представление формулы

Для данных в матрице X и отклик в векторе y:

  • Представление формулы с помощью 'x1' как первый предиктор (столбец) в X, 'x2' в качестве второго предиктора и т.д.

  • Представить вектор параметров для оптимизации как 'b1', 'b2'и т.д.

  • Записать формулу как 'y ~ (mathematical expressions)'.

Например, для представления ответа на данные реакции:

modelfun = 'y ~ (b1*x2 - x3/b5)/(1 + b2*x1 + b3*x2 + b4*x3)';

Для данных в таблице или массиве наборов данных можно использовать формулы, представленные в виде имен переменных из таблицы или массива наборов данных. Поместите имя ответной переменной слева от формулы, а затем ~, за которым следует символьный вектор, представляющий формулу ответа.

В этом примере показано, как создать вектор символов для представления ответа на reaction данные, находящиеся в массиве набора данных.

  1. Загрузить reaction данные.

    load reaction
  2. Поместите данные в массив наборов данных, где каждая переменная имеет имя, указанное в xn или yn.

    ds = dataset({reactants,xn(1,:),xn(2,:),xn(3,:)},...
        {rate,yn});
  3. Проверьте первую строку массива наборов данных.

    ds(1,:)
    
    ans = 
    
        Hydrogen    n_Pentane    Isopentane    ReactionRate
        470         300          10            8.55 
  4. Напишите hougen с использованием имен в массиве набора данных.

    modelfun = ['ReactionRate ~ (b1*n_Pentane - Isopentane/b5) /'...
    ' (1 + Hydrogen*b2 + n_Pentane*b3 + Isopentane*b4)']
    
    modelfun =
    ReactionRate ~ (b1*n_Pentane - Isopentane/b5) / ...
         (1 + Hydrogen*b2 + n_Pentane*b3 + Isopentane*b4)

Выбрать начальный вектор beta0

Начальный вектор для итераций подгонки, beta0, может в значительной степени влиять на качество полученной подогнанной модели. beta0 дает размерность задачи, означающую, что ей нужна правильная длина. Хороший выбор beta0 приводит к быстрой, надежной модели, в то время как плохой выбор может привести к длительным вычислениям или к неадекватной модели.

Сложно давать советы по выбору хорошего beta0. Если вы считаете, что определенные компоненты вектора должны быть положительными или отрицательными, установите beta0 чтобы иметь эти характеристики. Если известно приблизительное значение других компонентов, включите их в beta0. Однако если вы не знаете хороших значений, попробуйте случайный вектор, например

beta0 = randn(nVars,1);
% or
beta0 = 10*rand(nVars,1);

Вписать нелинейную модель в данные

Синтаксис для подгонки модели нелинейной регрессии с использованием таблицы или массива наборов данных tbl является

mdl = fitnlm(tbl,modelfun,beta0)

Синтаксис для подгонки модели нелинейной регрессии с использованием числового массива X и числовой вектор ответа y является

mdl = fitnlm(X,y,modelfun,beta0)

Сведения о представлении входных параметров см. в разделах Подготовка данных, Представление нелинейной модели и Выбор начального вектора beta0.

fitnlm предполагает, что переменная ответа в таблице или массиве набора данных tbl является последним столбцом. Чтобы изменить это, используйте ResponseVar пара «имя-значение» для присвоения имени столбцу ответа.

Проверка качества и настройка установленной нелинейной модели

Существуют диагностические графики, помогающие проверить качество модели. plotDiagnostics(mdl) дает различные графики, включая графики рычагов и расстояния Кука. plotResiduals(mdl) дает разницу между подогнанной моделью и данными.

Существуют также свойства mdl которые относятся к качеству модели. mdl.RMSE дает среднеквадратическую ошибку между данными и подогнанной моделью. mdl.Residuals.Raw дает необработанные остатки. mdl.Diagnostics содержит несколько полей, например Leverage и CooksDistance, это может помочь вам определить особенно интересные наблюдения.

В этом примере показано, как исследовать подогнанную нелинейную модель с использованием диагностических, остаточных и срезанных графиков.

Загрузите образцы данных.

load reaction

Создание нелинейной модели скорости как функции reactants с использованием hougen.m функция.

beta0 = ones(5,1);
mdl = fitnlm(reactants,...
    rate,@hougen,beta0);

Создайте график использования данных и модели.

plotDiagnostics(mdl)

Figure contains an axes. The axes with title Case order plot of leverage contains 2 objects of type line. These objects represent Leverage, Reference Line.

Есть один момент, который имеет высокие рычаги влияния. Найдите точку.

[~,maxl] = max(mdl.Diagnostics.Leverage)
maxl = 6

Изучите график остатков.

plotResiduals(mdl,'fitted')

Figure contains an axes. The axes with title Plot of residuals vs. fitted values contains 2 objects of type line.

Ничто не выделяется как излишество.

Используйте график среза, чтобы показать влияние каждого предиктора на модель.

plotSlice(mdl)

Figure Prediction Slice Plots contains 3 axes and other objects of type uimenu, uicontrol. Axes 1 contains 5 objects of type line. Axes 2 contains 5 objects of type line. Axes 3 contains 5 objects of type line.

Можно перетащить вертикальные пунктирные синие линии, чтобы увидеть влияние изменения одного предиктора на ответ. Например, перетащите линию X2 вправо и обратите внимание на изменение уклона линии X3.

Прогнозирование или моделирование ответов с использованием нелинейной модели

В этом примере показано, как использовать методы predict, feval, и random прогнозировать и моделировать ответы на новые данные.

Случайная генерация выборки из распределения Коши.

rng('default')
X = rand(100,1);
X = tan(pi*X - pi/2);

Создание ответа в соответствии с моделью y = b1*(pi /2 + atan((x - b2) / b3)) и добавить шум в ответ.

modelfun = @(b,x) b(1) * ...
    (pi/2 + atan((x - b(2))/b(3)));
y = modelfun([12 5 10],X) + randn(100,1);

Поместите модель, начиная с произвольных параметров b = [1,1,1].

beta0 = [1 1 1]; % An arbitrary guess
mdl = fitnlm(X,y,modelfun,beta0)
mdl = 
Nonlinear regression model:
    y ~ b1*(pi/2 + atan((x - b2)/b3))

Estimated Coefficients:
          Estimate      SE       tStat       pValue  
          ________    _______    ______    __________

    b1     12.082     0.80028    15.097    3.3151e-27
    b2     5.0603      1.0825    4.6747    9.5063e-06
    b3       9.64     0.46499    20.732    2.0382e-37


Number of observations: 100, Error degrees of freedom: 97
Root Mean Squared Error: 1.02
R-Squared: 0.92,  Adjusted R-Squared 0.918
F-statistic vs. zero model: 6.45e+03, p-value = 1.72e-111

Соответствующие значения находятся в пределах нескольких процентов от параметров [12,5,10].

Осмотрите посадку.

plotSlice(mdl)

Figure Prediction Slice Plots contains an axes and other objects of type uimenu, uicontrol. The axes contains 6 objects of type line.

predict

predict способ предсказывает средние ответы и, если запрашивается, дает доверительные границы. Найдите прогнозируемые значения отклика и прогнозируемые доверительные интервалы относительно отклика при значениях X [-15; 5; 12].

Xnew = [-15;5;12];
[ynew,ynewci] = predict(mdl,Xnew)
ynew = 3×1

    5.4122
   18.9022
   26.5161

ynewci = 3×2

    4.8233    6.0010
   18.4555   19.3490
   25.0170   28.0151

Доверительные интервалы отражаются на графике среза.

feval

feval способ предсказывает средние ответы. feval часто удобнее использовать, чем прогнозировать при построении модели из массива наборов данных.

Создайте нелинейную модель из массива наборов данных.

ds = dataset({X,'X'},{y,'y'});
mdl2 = fitnlm(ds,modelfun,beta0);

Найдите прогнозируемые отклики модели (CDF) при значениях X [-15; 5; 12].

Xnew = [-15;5;12];
ynew = feval(mdl2,Xnew)
ynew = 3×1

    5.4122
   18.9022
   26.5161

random

random способ моделирует новые значения случайного отклика, равные среднему прогнозу плюс случайное возмущение с той же дисперсией, что и обучающие данные.

Xnew = [-15;5;12];
ysim = random(mdl,Xnew)
ysim = 3×1

    6.0505
   19.0893
   25.4647

Повторно запустите случайный метод. Результаты меняются.

ysim = random(mdl,Xnew)
ysim = 3×1

    6.3813
   19.2157
   26.6541