Порівняйте статистичну значимість різниці між двома поліноміальними регресіями в R


10

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

Ratio<-(mydata2[,c(2)])
Time_in_days<-(mydata2[,c(1)])
fit3IRC <- lm( Ratio~(poly(Time_in_days,2)) )

Діаграми поліноміальних регресій:

введіть тут опис зображення

Коефіцієнти:

> as.vector(coef(fit3CN))
[1] -0.9751726 -4.0876782  0.6860041
> as.vector(coef(fit3IRC))
[1] -1.1446297 -5.4449486  0.5883757 

І тепер я хочу знати, чи є спосіб використовувати функцію R, щоб зробити тест, який би сказав мені, чи існує статистична значимість у різниці між регресією двох поліномів, знаючи, що відповідний інтервал днів є [ 1100].

З того, що я зрозумів, я не можу застосувати безпосередньо тест anova, оскільки значення походять з двох різних наборів даних, ані AIC, який використовується для порівняння моделі / справжніх даних.

Я намагався дотримуватися вказівок, поданих @Roland у відповідному питанні, але, мабуть, неправильно зрозумів щось, дивлячись на свої результати:

Ось що я зробив:

Я поєднав обидва набори даних в один.

fє змінним фактором, про який говорив @Roland. Я ставлю 1s для першого набору та 0s для другого.

y<-(mydata2[,c(2)])
x<-(mydata2[,c(1)])
f<-(mydata2[,c(3)])

plot(x,y, xlim=c(1,nrow(mydata2)),type='p')

fit3ANOVA <- lm( y~(poly(x,2)) )

fit3ANOVACN <- lm( y~f*(poly(x,2)) )

Зараз мої дані виглядають так:

введіть тут опис зображення

Червоний - fit3ANOVAце все ще працює, але у мене проблеми з синім, fit3ANOVACNмодель має дивні результати. Я не знаю, чи правильно підійде модель, я не розумію, що саме означав @Roland.

Враховуючи рішення @DeltaIV, я припускаю, що в такому випадку: введіть тут опис зображення Моделі значно відрізняються, хоча вони перетинаються. Чи правильно я вважаю це?


Мені здається, що коментар користувача @ Roland до питання, з яким ви посилаєтесь, чудово відповідає на ваше запитання. Що саме ви не розумієте?
DeltaIV

Ну пару речей, я не був впевнений, що це не так, чи ні, це була відповідна відповідь, оскільки це було в розділі коментарів, але якщо це працює тоді, я просто повинен бути впевнений, що я зрозумів. В основному, я повинен створити новий набір даних, де я створюю стовпець із розмірами 1s та 0s, залежно від того, з яких наборів даних вони походили? Потім після цього я створюю дві моделі: одна з кожними даними, а друга - з врахуванням лише одного набору даних. Потім я застосовую тест на анова. Це все ? Також я ніколи не використовував тест anova, я бачив, що вони говорили про належне значення p, що це було б саме?
PaoloH

1
У вашому випадку дві регресії знаходяться на одному інтервалі. Це найкращий випадок для інтерпретації довірчих смуг для лінійної регресії. У цьому випадку обидва регресії статистично не відрізняються, якщо вони знаходяться повністю в межах довіри один одного протягом усього інтервалу ( у вашому випадку) - не якщо вони просто перетинаються в невеликому підінтервалі. [0,100]
DeltaIV

Відповіді:


15
#Create some example data
mydata1 <- subset(iris, Species == "setosa", select = c(Sepal.Length, Sepal.Width))
mydata2 <- subset(iris, Species == "virginica", select = c(Sepal.Length, Sepal.Width))

#add a grouping variable
mydata1$g <- "a"
mydata2$g <- "b"

#combine the datasets
mydata <- rbind(mydata1, mydata2)

#model without grouping variable
fit0 <- lm(Sepal.Width ~ poly(Sepal.Length, 2), data = mydata)

#model with grouping variable
fit1 <- lm(Sepal.Width ~ poly(Sepal.Length, 2) * g, data = mydata)

#compare models 
anova(fit0, fit1)
#Analysis of Variance Table
#
#Model 1: Sepal.Width ~ poly(Sepal.Length, 2)
#Model 2: Sepal.Width ~ poly(Sepal.Length, 2) * g
#  Res.Df     RSS Df Sum of Sq      F    Pr(>F)    
#1     97 16.4700                                  
#2     94  7.1143  3    9.3557 41.205 < 2.2e-16 ***
#  ---
#  Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Як бачите, fit1це значно краще ніж fit0, тобто ефект змінної групування значний. Оскільки змінна групування представляє відповідні набори даних, то поліном, що відповідає двом наборам даних, може вважатися суттєво різним.


Вибачте, це повинно бути очевидним, але я не знайомий з результатами тесту Anova, що говорить нам, що fit1 краще, ніж fit0? Це Pr (> F), який надзвичайно низький?
PaoloH

1
Значення р говорить вам, якщо моделі суттєво відрізняються (нижче значення p означає «більш різне» з урахуванням варіації, зазвичай р <0,05 вважається значущим). Менший RSS вказує на кращу модель.
Роланд

@PaoloH Btw., Вам слід уникати співвідношень як залежних змінних. Припущення звичайних моделей найменших квадратів не мають такої залежної змінної.
Роланд

8

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

EDIT : відповідно до цього питання , схоже predict.lm, функція, що використовується ggplot2для обчислення довірчих інтервалів, не обчислює одночасні смуги довіри навколо криви регресії, а лише точкові смуги довіри. Ці останні смуги не є правильними для того, щоб оцінювати, чи дві встановлені лінійні моделі статистично відрізняються, або сказано іншим чином, чи вони можуть бути сумісні з тією самою справжньою моделлю чи ні. Таким чином, вони не є правильними кривими для відповіді на ваше запитання. Оскільки, мабуть, немає R-вбудованого пристрою для отримання одночасних смуг довіри (дивно!), Я написав власну функцію. Ось:

simultaneous_CBs <- function(linear_model, newdata, level = 0.95){
    # Working-Hotelling 1 – α confidence bands for the model linear_model
    # at points newdata with α = 1 - level

    # summary of regression model
    lm_summary <- summary(linear_model)
    # degrees of freedom 
    p <- lm_summary$df[1]
    # residual degrees of freedom
    nmp <-lm_summary$df[2]
    # F-distribution
    Fvalue <- qf(level,p,nmp)
    # multiplier
    W <- sqrt(p*Fvalue)
    # confidence intervals for the mean response at the new points
    CI <- predict(linear_model, newdata, se.fit = TRUE, interval = "confidence", 
                  level = level)
    # mean value at new points
    Y_h <- CI$fit[,1]
    # Working-Hotelling 1 – α confidence bands
    LB <- Y_h - W*CI$se.fit
    UB <- Y_h + W*CI$se.fit
    sim_CB <- data.frame(LowerBound = LB, Mean = Y_h, UpperBound = UB)
}

library(dplyr)
# sample datasets
setosa <- iris %>% filter(Species == "setosa") %>% select(Sepal.Length, Sepal.Width, Species)
virginica <- iris %>% filter(Species == "virginica") %>% select(Sepal.Length, Sepal.Width, Species)

# compute simultaneous confidence bands
# 1. compute linear models
Model <- as.formula(Sepal.Width ~ poly(Sepal.Length,2))
fit1  <- lm(Model, data = setosa)
fit2  <- lm(Model, data = virginica)
# 2. compute new prediction points
npoints <- 100
newdata1 <- with(setosa, data.frame(Sepal.Length = 
                                       seq(min(Sepal.Length), max(Sepal.Length), len = npoints )))
newdata2 <- with(virginica, data.frame(Sepal.Length = 
                                          seq(min(Sepal.Length), max(Sepal.Length), len = npoints)))
# 3. simultaneous confidence bands
mylevel = 0.95
cc1 <- simultaneous_CBs(fit1, newdata1, level = mylevel)
cc1 <- cc1 %>% mutate(Species = "setosa", Sepal.Length = newdata1$Sepal.Length)
cc2 <- simultaneous_CBs(fit2, newdata2, level = mylevel)
cc2 <- cc2 %>% mutate(Species = "virginica", Sepal.Length = newdata2$Sepal.Length)

# combine datasets
mydata <- rbind(setosa, virginica)
mycc   <- rbind(cc1, cc2)    
mycc   <- mycc %>% rename(Sepal.Width = Mean) 
# plot both simultaneous confidence bands and pointwise confidence
# bands, to show the difference
library(ggplot2)
# prepare a plot using dataframe mydata, mapping sepal Length to x,
# sepal width to y, and grouping the data by species
p <- ggplot(data = mydata, aes(x = Sepal.Length, y = Sepal.Width, color = Species)) + 
# add data points
geom_point() +
# add quadratic regression with orthogonal polynomials and 95% pointwise
# confidence intervals
geom_smooth(method ="lm", formula = y ~ poly(x,2)) +
# add 95% simultaneous confidence bands
geom_ribbon(data = mycc, aes(x = Sepal.Length, color = NULL, fill = Species, ymin = LowerBound, ymax = UpperBound),alpha = 0.5)
print(p)

введіть тут опис зображення

Внутрішні смуги - це ті, які обчислюються за замовчуванням geom_smooth: це точкові смуги довіри 95% навколо кривих регресії. Зовнішні, напівпрозорі смуги (спасибі за графічну підказку, @Roland) - це замість одночасних 95% довірчих смуг. Як бачимо, вони більші, ніж очікувані смуги. Той факт, що параметри одночасної довіри з двох кривих не перетинаються, може сприйматися як ознака того, що різниця між двома моделями є статистично значущою.

Звичайно, для тесту гіпотези з дійсним значенням p- значення слід дотримуватися підходу @Roland, але цей графічний підхід може розглядатися як дослідницький аналіз даних. Також сюжет може дати нам додаткові ідеї. Зрозуміло, що моделі для двох наборів даних статистично відрізняються. Але також виглядає так, що дві моделі ступеня 1 майже повністю відповідатимуть даним, а також дві квадратичні моделі. Ми можемо легко перевірити цю гіпотезу:

fit_deg1 <- lm(data = mydata, Sepal.Width ~ Species*poly(Sepal.Length,1))
fit_deg2 <- lm(data = mydata, Sepal.Width ~ Species*poly(Sepal.Length,2))
anova(fit_deg1, fit_deg2)
# Analysis of Variance Table

# Model 1: Sepal.Width ~ Species * poly(Sepal.Length, 1)
# Model 2: Sepal.Width ~ Species * poly(Sepal.Length, 2)
#  Res.Df    RSS Df Sum of Sq      F Pr(>F)
# 1     96 7.1895                           
# 2     94 7.1143  2  0.075221 0.4969   0.61

Різниця між моделлю 1 ступеня і моделлю ступеня 2 не є суттєвою, тому ми можемо також використовувати дві лінійні регресії для кожного набору даних.


3
+1 для накреслення. Важлива частина статистичних аналізів.
Roland

Просто для переконання у вашому методі: той факт, що "довірчі інтервали від двох кривих не перетинаються, можна вважати свідченням того, що різниця між двома моделями є статистично значущою". Але я не можу сказати, що різниця не суттєва, якщо вони перетинаються правильно?
PaoloH

Щоб бути більш конкретним, я додав приклад у дописі.
PaoloH

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