Параметрические нелинейные модели представляют отношение между непрерывной переменной отклика и одним или несколькими непрерывными переменными предикторами в форме
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
содержит несколько полей, таких как 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