11.7: Використання R для багатовимірної лінійної регресії
- Page ID
- 17762
Щоб проілюструвати, як ми можемо використовувати R для завершення багатоваріантної лінійної регресії, скористайтеся цим посиланням та збережіть файл allSpec.csv
у вашому робочому каталозі. Дані в цьому файлі складаються з 80 рядків і 642 стовпців. Кожен ряд є незалежним зразком, який містить один або кілька наступних катіонів перехідних металів: Cu 2 +, Co 2 +, Cr 3 + і Ni 2 +. Перші сім колонок надають інформацію про зразки:
- id зразка (у вигляді custd_1 для єдиного стандарту Cu 2 + або nicu_mix1 для суміші Ni 2 + і Cu 2 +)
- перелік аналітів у зразку (у вигляді cuco для зразка, що містить Cu 2 + і Co 2 +)
- кількість аналітів у зразку (число від 1 до 4 і марковане як розміри)
- молярна концентрація Cu 2 + в зразку
- молярна концентрація Co 2 + в зразку
- молярна концентрація Cr 3 + в зразку
- молярна концентрація Ni 2 + в зразку
Решта стовпців містять значення поглинання на 635 довжині хвиль між 380,5 нм і 899,5 нм. Ми будемо використовувати підмножину цих даних, ідентичну тій, яка використовується для ілюстрації кластерного аналізу та аналізу основних компонентів.
По-перше, нам потрібно прочитати дані в R, що ми робимо за допомогою функції read.csv ()
Спец_дані <- read.csv (» allSpec.csv «, перевірка.імена = ПОМИЛКОВО)
де параметр check.names = FALSE
перевизначає типову функцію, щоб не дозволити ім'я стовпця починатися з числа. Далі ми створимо об'єкти для утримання концентрацій та поглинань для стандартних розчинів Cu 2 +, Cr 3 + та Co 2 +, які є трьома аналітами
довжина хвилі_іди = seq (8, 642, 40)
abs_stds = spec_data [1:15, довжина хвилі_ids]
conc_stds = даний.кадр (spec_data [1:15, 4], spec_data [1:15, 5], spec_data [1:15, 6])
abs_samples = spec_data [c (1, 6, 11, 21:25, 38:53), довжина хвилі_ids]
де wavelength_ids
- вектор, який ідентифікує 16 однаково розташованих довжин хвиль, abs_stds
- це кадр даних, який дає значення поглинання для 15 стандартних рішень трьох аналітів Cu 2 +, Cr 3 + та Co 2 + на довжині хвиль 16 conc_stds
- це кадр даних, який містить концентрації трьох аналітів у стандартних рішеннях 15, а abs_samples
- це кадр даних, який містить поглинання зразка 24 на довжині хвиль 16. Це ті самі дані, які використовуються для ілюстрації кластерного аналізу та аналізу основних компонентів.
Для вирішення\(\epsilon b\) матриці ми запишемо та отримаємо наступну функцію, яка приймає два об'єкти - кадр даних значень поглинання та кадр даних концентрацій - і повертає матрицю\(\epsilon b\) значень.
findeb = функція (абс, конц) {
abs.m = as.matrix (abs)
concm = as.matrix (conc)
ct = t (
concm) ctc = ct %*%
concm invctc = вирішити (CTC)
eb = invctc %*% ct %*% abs.m
вихід = бути
невидимим ( вихід)
}
Передача abs_stds і conc_stds у функцію
eb_pred = знайдено (abs_stds, conc_stds)
повертає передбачені значення для\(\epsilon b\) цього складають наше калібрування. Як ми бачимо нижче, графік\(\epsilon b\) значень для Cu 2 + має таку ж форму, як і графік значень поглинання для одного з стандартів Cu 2 +.
довжини хвиль = як.numeric (прізвища (spec_data [8:642]))
old.par = пар (mmrow = c (2,1))
графік (x = довжини хвиль [довжина хвилі [ids], y = eb_pred [1,], тип = «b»,
xlab = «довжина хвилі (нм)», ylab = «eb», lwd = 2, col = «синій»)
графік (x = довжини хвиль, y = spec_ дані [1, 8:642], тип = «l»,
xlab = «довжина хвилі (нм)», ylab = «поглинання», lwd = 2, col = «синій»)
пар (old.par)
Завершивши калібрування, ми можемо визначити концентрації трьох аналітів у зразках 24 за допомогою наступної функції, яка приймає як вхідні дані кадру даних значень абсорбенції та\(\epsilon b\) матрицю, яку повертає функція findeb
findconc = функція (abs, eb) {
abs.m = як.матриця (abs)
ebm = як.матриця (
ЕБ) Ебт = t (ebm)
ebet = eb %*% ebet
інвебет = вирішити (ebebt)
pred_conc = круглий (abs.m %*% Ебт %*% інвебебт, цифри = 5)
вихід = pred_conc
невидимий (вихід)
}
pred_conc = findconc (abs_samples, eb_pred)
Щоб визначити похибку в прогнозованих концентраціях, ми спочатку витягуємо фактичні концентрації з вихідного набору даних як фрейм даних, коригуючи назви стовпців для наочності.
real_conc = data.frame (спец_дані [c (1, 6, 11, 21:25, 38:53), 4],
spec_data [c (1, 6, 11, 21:25, 38:53), 5],
spec_data [c (1, 6, 11, 21:25, 38:53), 6])
прізвища (real_conc) = c («мідь», «кобальт», «хром»)
і визначити різницю між фактичними концентраціями та прогнозованими концентраціями
conc_error = реальні_conc - перед_конц
Нарешті, ми можемо повідомити про середню помилку, стандартне відхилення та довірчий інтервал 95% для кожного аналіта.
означає = застосувати (conc_error, 2, середнє)
круглий (означає, цифри = 6)
мідь кобальт хром
-0.000280 -0.000153 -0.000210
sds = застосовувати (conc_error, 2, sd)
круглий (sds, цифри = 6)
мідь кобальт хром
0.001037 0,000811 0,000688
conf.it = абс (qt (0,05/2, 20)) * сдс
круглий (conf.it, цифри = 6)
мідь кобальт хром
0.002163 0.00163 0,001434
Порівняно з діапазонами концентрацій для трьох аналітів у зразках 24
діапазон (реальні_conc$ мідь)
[1] 0.00 0.05
діапазон (реальні_conc$ кобальт)
[1] 0.0 0,1
діапазон (реальні_conc$ хром)
[1] 0.0000 0.0375
середні похибки та довірчі інтервали досить малі, щоб ми мали впевненість у результатах.