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

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

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

y = f (X, β) + ε,

где

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

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

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

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

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

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

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

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

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

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

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

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

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

Представляйте недостающие данные как 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)

Выберите Initial Vector 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)

Для получения информации о представлении входных параметров см. Подготовку данных, Представляйте Нелинейную Модель и Выберите Initial Vector beta0.

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

Исследуйте качество и настройте подходящую нелинейную модель

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

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

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

Загрузите выборочные данные.

load reaction

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

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

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

plotDiagnostics(mdl)

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

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

Исследуйте график невязок.

plotResiduals(mdl,'fitted')

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

Используйте график среза показать эффект каждого предиктора на модели.

plotSlice(mdl)

Можно перетащить вертикальные пунктирные синие строки, чтобы видеть эффект изменения в одном предикторе на ответе. Например, перетащите строку 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)

предсказать

Метод 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 моделирует новые случайные значения ответа, равные среднему прогнозу плюс случайное воздействие с тем же отклонением как данные тренировки.

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