В этом примере показано, как подбирать модель линейной регрессии. Типичный рабочий процесс включает следующее: импортируйте данные, соответствуйте регрессии, протестируйте ее качество, измените их, чтобы улучшить качество и совместно использовать их.
hospital.xls
электронная таблица Excel®, содержащая имена пациентов, пол, возраст, вес, артериальное давление и даты лечения в протоколе эксперимента. Сначала считайте данные в таблицу.
patients = readtable('hospital.xls','ReadRowNames',true);
Исследуйте пять строк данных.
patients(1:5,:)
ans=5×11 table
name sex age wgt smoke sys dia trial1 trial2 trial3 trial4
____________ _____ ___ ___ _____ ___ ___ ______ ______ ______ ______
YPL-320 {'SMITH' } {'m'} 38 176 1 124 93 18 -99 -99 -99
GLI-532 {'JOHNSON' } {'m'} 43 163 0 109 77 11 13 22 -99
PNI-258 {'WILLIAMS'} {'f'} 38 131 0 125 83 -99 -99 -99 -99
MIJ-579 {'JONES' } {'f'} 40 133 0 117 75 6 12 -99 -99
XLK-030 {'BROWN' } {'f'} 49 119 0 122 80 14 23 -99 -99
sex
и smoke
поля, кажется, имеют два варианта каждый. Так измените эти поля в категориальный.
patients.smoke = categorical(patients.smoke,0:1,{'No','Yes'}); patients.sex = categorical(patients.sex);
Ваша цель состоит в том, чтобы смоделировать систолическое давление в зависимости от возраста пациента, веса, пола и курения состояния. Создайте линейную формулу для 'sys'
в зависимости от 'age'
, 'wgt'
, 'sex'
, и 'smoke'
.
modelspec = 'sys ~ age + wgt + sex + smoke';
mdl = fitlm(patients,modelspec)
mdl = Linear regression model: sys ~ 1 + sex + age + wgt + smoke Estimated Coefficients: Estimate SE tStat pValue _________ ________ ________ __________ (Intercept) 118.28 7.6291 15.504 9.1557e-28 sex_m 0.88162 2.9473 0.29913 0.76549 age 0.08602 0.06731 1.278 0.20438 wgt -0.016685 0.055714 -0.29947 0.76524 smoke_Yes 9.884 1.0406 9.498 1.9546e-15 Number of observations: 100, Error degrees of freedom: 95 Root Mean Squared Error: 4.81 R-squared: 0.508, Adjusted R-Squared: 0.487 F-statistic vs. constant model: 24.5, p-value = 5.99e-14
Пол, возраст и предикторы веса имеют довольно высоко - значения, указывая, что некоторые из этих предикторов могут быть ненужными.
Смотрите, существуют ли выбросы в данных, которые должны быть исключены из подгонки. Постройте остаточные значения.
plotResiduals(mdl)
Существует один возможный выброс со значением, больше, чем 12. Это - вероятно, не действительно выброс. Для демонстрации вот то, как найти и удалить ее.
Найдите выброс.
outlier = mdl.Residuals.Raw > 12; find(outlier)
ans = 84
Удалите выброс.
mdl = fitlm(patients,modelspec,... 'Exclude',84); mdl.ObservationInfo(84,:)
ans=1×4 table
Weights Excluded Missing Subset
_______ ________ _______ ______
WXM-486 1 true false false
Наблюдение 84 больше не находится в модели.
Попытайтесь получить более простую модель, один с меньшим количеством предикторов, но той же прогнозирующей точностью. step
ищет лучшую модель путем добавления или удаления одного термина за один раз. Позвольте step
сделайте до 10 шагов.
mdl1 = step(mdl,'NSteps',10)
1. Removing wgt, FStat = 4.6001e-05, pValue = 0.9946 2. Removing sex, FStat = 0.063241, pValue = 0.80199
mdl1 = Linear regression model: sys ~ 1 + age + smoke Estimated Coefficients: Estimate SE tStat pValue ________ ________ ______ __________ (Intercept) 115.11 2.5364 45.383 1.1407e-66 age 0.10782 0.064844 1.6628 0.09962 smoke_Yes 10.054 0.97696 10.291 3.5276e-17 Number of observations: 99, Error degrees of freedom: 96 Root Mean Squared Error: 4.61 R-squared: 0.536, Adjusted R-Squared: 0.526 F-statistic vs. constant model: 55.4, p-value = 1.02e-16
step
сделал два шага. Это означает, что не могло улучшить модель далее путем добавления или вычитания одного термина.
Постройте эффективность более простой модели на обучающих данных.
plotResiduals(mdl1)
Остаточные значения наводят справки столь же маленький как те из исходной модели.
Предположим, что у вас есть четыре новых человека, 25 лет, 30, 40, и 65, и первый и третий дым. Предскажите их систолическое давление с помощью mdl1
.
ages = [25;30;40;65]; smoker = {'Yes';'No';'Yes';'No'}; systolicnew = feval(mdl1,ages,smoker)
systolicnew = 4×1
127.8561
118.3412
129.4734
122.1149
Чтобы сделать предсказания, вам нужны только переменные что mdl1
использование.
Вы можете хотеть, чтобы другие смогли использовать вашу модель для предсказания. Доступ к условиям в линейной модели.
coefnames = mdl1.CoefficientNames
coefnames = 1x3 cell
{'(Intercept)'} {'age'} {'smoke_Yes'}
Просмотрите формулу модели.
mdl1.Formula
ans = sys ~ 1 + age + smoke
Доступ к коэффициентам условий.
coefvals = mdl1.Coefficients(:,1).Estimate
coefvals = 3×1
115.1066
0.1078
10.0540
Моделью является sys = 115.1066 + 0.1078*age + 10.0540*smoke
, где smoke
1
для курильщика и 0
в противном случае.
feval
| fitlm
| LinearModel
| plotResiduals
| step