Параметрические нелинейные модели представляют взаимосвязь между переменной непрерывного ответа и одной или несколькими переменными непрерывного предиктора в форме
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 вычисляет
+ 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 данные, находящиеся в массиве набора данных.
Загрузить reaction данные.
load reaction
Поместите данные в массив наборов данных, где каждая переменная имеет имя, указанное в xn или yn.
ds = dataset({reactants,xn(1,:),xn(2,:),xn(3,:)},...
{rate,yn});Проверьте первую строку массива наборов данных.
ds(1,:)
ans =
Hydrogen n_Pentane Isopentane ReactionRate
470 300 10 8.55 Напишите 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 = 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)

Есть один момент, который имеет высокие рычаги влияния. Найдите точку.
[~,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
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