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