Який тест можна використати для порівняння укосів двох або більше регресійних моделей?


29

Я хотів би перевірити різницю у відповіді двох змінних на один предиктор. Ось мінімальний відтворюваний приклад.

library(nlme) 
## gls is used in the application; lm would suffice for this example
m.set <- gls(Sepal.Length ~ Petal.Width, data = iris, 
               subset = Species == "setosa")
m.vir <- gls(Sepal.Length ~ Petal.Width, data = iris, 
               subset = Species == "virginica")
m.ver <- gls(Sepal.Length ~ Petal.Width, data = iris, 
               subset = Species == "versicolor")

Я бачу, що коефіцієнти нахилу різні:

m.set$coefficients
(Intercept) Petal.Width 
  4.7771775   0.9301727
m.vir$coefficients
(Intercept) Petal.Width 
  5.2694172   0.6508306 
m.ver$coefficients
(Intercept) Petal.Width 
   4.044640    1.426365 

У мене три питання:

  1. Як я можу перевірити різницю між схилами?
  2. Як я можу перевірити різницю між залишковими відхиленнями?
  3. Який простий, ефективний спосіб представити ці порівняння?

Питання, пов’язане із цим, Метод порівняння змінного коефіцієнта у двох моделях регресії пропонує повторно запустити модель з фіксованою змінною для диференціації схилів, чи є варіанти, які дозволяли б використовувати незалежні набори даних?


Що стосується першого питання см stats.stackexchange.com/questions/55501 / ... .
russellpierce

Відповіді:


22

Як я можу перевірити різницю між схилами?

PiLiPiS1,S2,S3

E(Li)=β0+β1Pi

Pi

E(Li)=α0+α1S2+α2S3+α4Pi+α5PiS2+α6PiS3

logLik44

Який простий, ефективний спосіб представити порівняння?

Pi

Редагувати: я помітив, що інше питання було додано до тіла. Отже, я додаю відповідь на це:

Як я можу перевірити різницю між залишковими відхиленнями?

Для цього вам потрібно буде розшаровувати набір даних і підходити до окремих моделей, оскільки модель, заснована на взаємодії, обмежуватиме залишкову дисперсію однаковою для кожної групи. Якщо вам підійдуть окремі моделі, це обмеження зникає. У цьому випадку ви все ще можете скористатися тестом коефіцієнта ймовірності (ймовірність більшої моделі зараз обчислюється шляхом підсумовування ймовірностей за трьома окремими моделями). "Нульова" модель залежить від того, з чим ви хочете її порівняти

  • 2

  • 6


S1gls(Sepal.Length ~ species:Petal.Width, data = iris)

S1α0+α4Pispeciesgls(Sepal.Length ~ species*Petal.Width, data=iris)

@Macro Приємна відповідь (+1)! Цікаво, чи могли ви підійти до glsмоделі, але допускаючи різні залишкові відхилення для кожного виду з можливістю weights=varIdent(form=~1|Species)(стосовно другого питання)?
COOLSerdash

15

Щоб відповісти на ці запитання з кодом R, використовуйте наступне:
1. Як я можу перевірити різницю між нахилами?
Відповідь: Вивчіть p-значення ANOVA на основі взаємодії Petal.Width за видами, а потім порівняйте нахили, використовуючи lsmeans :: lstrends, наступним чином.

library(lsmeans)
m.interaction <- lm(Sepal.Length ~ Petal.Width*Species, data = iris)
anova(m.interaction)
 Analysis of Variance Table

 Response: Sepal.Length
                      Df Sum Sq Mean Sq  F value Pr(>F)    
 Petal.Width           1 68.353  68.353 298.0784 <2e-16 ***
 Species               2  0.035   0.017   0.0754 0.9274    
 Petal.Width:Species   2  0.759   0.380   1.6552 0.1947    
 Residuals           144 33.021   0.229                    
 ---
 Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

# Obtain slopes
m.interaction$coefficients
m.lst <- lstrends(m.interaction, "Species", var="Petal.Width")
 Species    Petal.Width.trend        SE  df   lower.CL upper.CL
 setosa             0.9301727 0.6491360 144 -0.3528933 2.213239
 versicolor         1.4263647 0.3459350 144  0.7425981 2.110131
 virginica          0.6508306 0.2490791 144  0.1585071 1.143154

# Compare slopes
pairs(m.lst)
 contrast                 estimate        SE  df t.ratio p.value
 setosa - versicolor    -0.4961919 0.7355601 144  -0.675  0.7786
 setosa - virginica      0.2793421 0.6952826 144   0.402  0.9149
 versicolor - virginica  0.7755341 0.4262762 144   1.819  0.1669

2. Як я можу перевірити різницю між залишковими відхиленнями?
Якщо я розумію питання, ви можете порівняти співвідношення Пірсона з перетворенням Фішера, що також називається "r-to-z" Фішера, наступним чином.

library(psych)
library(data.table)
iris <- as.data.table(iris)
# Calculate Pearson's R
m.correlations <- iris[, cor(Sepal.Length, Petal.Width), by = Species]
m.correlations
# Compare R values with Fisher's R to Z
paired.r(m.correlations[Species=="setosa", V1], m.correlations[Species=="versicolor", V1], 
         n = iris[Species %in% c("setosa", "versicolor"), .N])
paired.r(m.correlations[Species=="setosa", V1], m.correlations[Species=="virginica", V1], 
         n = iris[Species %in% c("setosa", "virginica"), .N])
paired.r(m.correlations[Species=="virginica", V1], m.correlations[Species=="versicolor", V1], 
         n = iris[Species %in% c("virginica", "versicolor"), .N])

3. Який простий, ефективний спосіб представити ці порівняння?
"Ми використовували лінійну регресію для порівняння відношення довжини Сепала до ширини пелюсток для кожного виду. Ми не знайшли значної взаємодії у співвідношеннях довжини Сепала до ширини пелюстки для І. Сетоса (B = 0,9), I. Версіколора (B = 1,4), ні І. Вірджиніка (B = 0,6); F (2, 144) = 1,6, p = 0,19. Порівняння Фішера r-to-z вказувало, що кореляція Пірсона для І. Сетоза (r = 0,28) була значно нижчий (p = 0,02), ніж I. Versicolor (r = 0,55). Аналогічно, кореляція для I. Virginica (r = 0,28) була значно слабшою (p = 0,02), ніж та, яка спостерігалась у I. Versicolor. "

Нарешті, завжди візуалізуйте свої результати!

plotly_interaction <- function(data, x, y, category, colors = col2rgb(viridis(nlevels(as.factor(data[[category]])))), ...) {
  # Create Plotly scatter plot of x vs y, with separate lines for each level of the categorical variable. 
  # In other words, create an interaction scatter plot.
  # The "colors" must be supplied in a RGB triplet, as produced by col2rgb().

  require(plotly)
  require(viridis)
  require(broom)

  groups <- unique(data[[category]])

  p <- plot_ly(...)

  for (i in 1:length(groups)) {
    groupData = data[which(data[[category]]==groups[[i]]), ]
    p <- add_lines(p, data = groupData,
                   y = fitted(lm(data = groupData, groupData[[y]] ~ groupData[[x]])),
                   x = groupData[[x]],
                   line = list(color = paste('rgb', '(', paste(colors[, i], collapse = ", "), ')')),
                   name = groups[[i]],
                   showlegend = FALSE)
    p <- add_ribbons(p, data = augment(lm(data = groupData, groupData[[y]] ~ groupData[[x]])),
                     y = groupData[[y]],
                     x = groupData[[x]],
                     ymin = ~.fitted - 1.96 * .se.fit,
                     ymax = ~.fitted + 1.96 * .se.fit,
                     line = list(color = paste('rgba','(', paste(colors[, i], collapse = ", "), ', 0.05)')), 
                     fillcolor = paste('rgba', '(', paste(colors[, i], collapse = ", "), ', 0.1)'),
                     showlegend = FALSE)
    p <- add_markers(p, data = groupData, 
                     x = groupData[[x]], 
                     y = groupData[[y]],
                     symbol = groupData[[category]],
                     marker = list(color=paste('rgb','(', paste(colors[, i], collapse = ", "))))
  }
  p <- layout(p, xaxis = list(title = x), yaxis = list(title = y))
  return(p)
}

plotly_interaction(iris, "Sepal.Length", "Petal.Width", "Species")

irisPlot


8

Я згоден з попередньою пропозицією. Вам слід встановити модель множинної регресії з фіксованою змінною для кожного набору даних. Це дозволить перевірити, чи відрізняються перехоплення. Якщо ви також хочете знати, чи відрізняються схили , вам також потрібно включити взаємодію між манекенами та змінною, про яку йдеться. Немає проблем з тим, що дані незалежні. Зверніть увагу , що якщо вони і незалежні і (наприклад) різних видів, то ви б не бути в змозі сказати , є чи різниця , яку ви знайдете в зв'язку з різними видами або різними наборами даних, так як вони абсолютно осоромлені. Однак тесту немає / картки без в'язниці, яка дозволить вам обійти цю проблему без збору нового зразка та повторного запуску навчання.


Схоже, ми розмістили досить схожі відповіді майже в той самий час. +1
Макрос

@Macro, так, але ваш здебільшого кращий (+1 раніше); Ви вирішили усі 3 питання, які я пропустив під час свого першого (не ретельного) прочитання питання. Мій внесок тут - частина про непорозуміння.
gung - Відновіть Моніку

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

3
З мого способу мислення ви обидва повинні отримати нагороди, що я і роблю.
Майкл Р. Черник

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