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

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

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

y = f (X, β) + ε,

где

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

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

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

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

  • ε является n-на-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)

Выберите Начальный Вектор Бета0

Начальный вектор для итераций аппроксимации, 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

The 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

The 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

The 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