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

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

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

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' как первый предиктор (столбец) в Xx2 как второй предиктор, и т.д.

  • Представляйте вектор из параметров, чтобы оптимизировать как '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 содержит несколько полей, таких как 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 изменяется.

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

В этом примере показано, как использовать методы predictfeval, и 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