Параметрические нелинейные модели представляют отношение между непрерывной переменной отклика и одной или несколькими непрерывными переменными прогноза в форме
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
вычисляет
Исследуйте функцию путем ввода 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)
Для получения информации о представлении входных параметров см. Подготовку данных, Представляйте Нелинейную Модель и Выберите 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