Як я можу знайти p-значення плавної регресії сплайну / лесової?


10

У мене є деякі змінні, і мені цікаво знайти нелінійні зв’язки між ними. Тож я вирішив прилаштувати якийсь сплайн або льос і надрукувати приємні сюжети (див. Код нижче). Але я також хочу мати певну статистику, яка дає мені уявлення, наскільки ймовірним є те, що відносини є питанням випадковості ... тобто, мені потрібно певне значення p, як, наприклад, для лінійної регресії. Іншими словами, мені потрібно знати, чи має вбудована крива сенс, оскільки мій код буде відповідати кривій будь-яким даним.

x <- rnorm(1000)
y <- sin(x) + rnorm(1000, 0, 0.5)

cor.test(x,y)
plot(x, y, xlab = xlab, ylab = ylab)
spl1 <- smooth.spline(x, y, tol = 1e-6, df = 8)
lines(spl1, col = "green", lwd = 2)

spl2 <- loess(y ~ x)
x.pr <- seq(min(x), max(x), length.out = 100)
lines(x.pr, predict(spl2, x.pr), col = "blue", lwd = 2)

Відповіді:


8

Бібліотека сплайнів має функції, bsі nsце створить основу сплайну для використання з lmфункцією, тоді ви можете встановити лінійну модель і модель, що включає сплайни, і використовувати anovaфункцію для повного і зменшеного тестування моделі, щоб побачити, чи відповідає модель сплайну значно краще ніж лінійна модель.

Ось приклад коду:

x <- rnorm(1000)
y <- sin(x) + rnorm(1000, 0, 0.5)

library(splines)

fit1 <- lm(y~x)
fit0 <- lm(y~1)
fit2 <- lm(y~bs(x,5))

anova(fit1,fit2)
anova(fit0,fit2)

plot(x,y, pch='.')
abline(fit1, col='red')
xx <- seq(min(x),max(x), length.out=250)
yy <- predict(fit2, data.frame(x=xx))
lines(xx,yy, col='blue')

Ви також можете скористатися polyфункцією, щоб зробити поліномічну підгонку та перевірити нелінійні доданки як тест кривизни.

Для льосу підійде трохи складніше. Існують деякі оцінки еквівалентних ступенів свободи для параметра згладжування льосу, які можуть бути використані разом зі значеннями для лінійної та льосової моделей для побудови та тестування F. Я думаю, що методи, засновані на тестах завантаження та перестановки, можуть бути більш інтуїтивними.R2

Існують методи обчислення та побудови інтервалу довіри для льосового пристосування (я думаю, що в пакет ggplot2 може бути вбудований спосіб). Ви можете побудувати діапазон довіри і побачити, чи пряма лінія підходитиме до діапазону (це не є р-значенням, але все ж дає так / ні.

Ви можете підходити до лінійної моделі і приймати залишки і підходити до льосової моделі для залишків як відповідь (і змінну, що цікавить, як прогноктор), якщо справжня модель є лінійною, то ця відповідність повинна бути близькою до плоскої лінії та упорядковувати точки відносно прогноктора не повинно змінювати жодних змін. Ви можете використовувати це для створення тесту на перестановку. Підійдіть до льосу, знайдіть передбачуване значення, найдальше від 0, тепер випадковим чином перестановіть точки та встановіть новий лес і знайдіть найбільш віддалену передбачувану точку від 0, повторіть купу разів, р-значення - це частка перестановлених значень, які надалі від 0, ніж початкове значення.

Ви також можете розглянути перехресну перевірку як метод вибору пропускної здатності льосу. Це не дає p-значення, але нескінченна пропускна здатність відповідає ідеальній лінійній моделі, якщо перехресна перевірка передбачає дуже велику пропускну здатність, то те, що дозволяє припустити, що лінійна модель може бути розумною, якщо більш високі смуги пропускання явно поступаються деяким менша пропускна здатність, то це говорить про певну кривизну, а лінійна недостатня.


Дякую, Грег! Я думаю, що перший абзац звучить як шлях, за винятком того, що я не зацікавлений у порівнянні з лінійною моделлю, просто щоб побачити, пояснює це сплайн чи ні. Чи можете ви надати якийсь код або більш конкретні вказівки щодо тестування сплайну на anova? Я дивився на функції bs і ns, але в статистиці я не такий хороший, щоб міг сам його вигадувати.
Цікаво

І так, я знайшов, як обчислити для льосу (див. Fibosworld.wordpress.com/2012/11/04/loess-regression-with-r ), але я не маю уявлення, як перетворити в p- значення ...R2R2
Цікаво

Я додав приклад коду для anovaпідходу зі сплайнами. Для тесту F з врахуйте, що - SSR, поділений на SST, а - SSE, поділений на SST, тому відношення просто SSR, поділений на SSE (2 випадки SST скасовуються). Включіть ступінь свободи і трохи алгебри, і у вас є F-статистика загальної регресії. R2R21R2R21R2
Грег Сніг

Грег, дякую! 1) Скажіть, будь ласка, що lm(y~bs(x,5))робить і чому це не так lm(y~I(bs(x,5)))? Я дуже заплутався в цьому дзвінку, оскільки результат bs (x, 5) не є змінною ... 2) Чи правильно я розумію, що значення, яке я шукаю, є результатом anova(fit0,fit2)?
Цікаво

1
Це просто лінійна регресія. Подібно до того, як ви можете робити лінійну регресію з , і для встановлення кривої на основі многочлена, функція створює перетворення змінної і передає їх до якої робить лінійну регресію. xx2x3bsxlm
Грег Сніг
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.