Какой тест я могу использовать для сравнения уклонов двух или более регрессионных моделей?

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. Какой простой и эффективный способ представить эти сравнения?

Смежный вопрос, « Метод сравнения переменных коэффициентов в двух регрессионных моделях» , предлагает повторно запустить модель с фиктивной переменной для дифференциации уклонов. Существуют ли варианты, позволяющие использовать независимые наборы данных?

Abe
источник
По первому вопросу см. Stats.stackexchange.com/questions/55501/… .
Russellpierce

Ответы:

22

Как я могу проверить разницу между склонами?

Включите манекен для видов, дайте ему взаимодействовать с и посмотрите, ли этот манекен. Пусть - длина чашелистика, - ширина педали, а - фиктивные переменные для трех видов. Сравнить модельL i P i S 1 , S 2 , S 3пяLяпяS1,S2,S3

Е(Lя)знак равноβ0+β1пя

с моделью, которая позволяет эффекту быть различным для каждого вида:пя

Е(Lя)знак равноα0+α1S2+α2S3+α4пя+α5пяS2+α6пяS3

Оценщики GLS являются MLE, а первая модель является подмоделью второй, поэтому вы можете использовать здесь тест отношения правдоподобия. Вероятности можно извлечь с помощью logLikфункции, и степени свободы для теста будут равны поскольку вы удалили параметра, чтобы получить подмодель.444

Какой простой и эффективный способ представить сравнение?

Я думаю, что наиболее привлекательным способом было бы построить линии регрессии для каждого вида на одних и тех же осях, возможно, с помощью столбцов ошибок, основанных на стандартных ошибках. Это сделало бы разницу (или отсутствие различий) между видами и их отношением к очень очевидной.пя

Изменить: я заметил еще один вопрос был добавлен в тело. Итак, я добавляю ответ на это:

Как я могу проверить разницу между остаточными отклонениями?

Для этого вам нужно будет расслоить набор данных и подогнать отдельные модели, поскольку предложенная мной модель взаимодействия будет ограничивать остаточную дисперсию одинаковой в каждой группе. Если вы подходите отдельным моделям, это ограничение исчезнет. В этом случае вы все равно можете использовать тест отношения правдоподобия (вероятность для более крупной модели теперь рассчитывается путем суммирования правдоподобия из трех отдельных моделей). «Нулевая» модель зависит от того, с чем вы хотите сравнить ее

  • если вы хотите только проверить дисперсию, оставив основные эффекты в ней, то «нулевой» моделью должна быть модель с взаимодействиями, которые я написал выше. Степени свободы для теста равны .2

  • Если вы хотите проверить дисперсию вместе с коэффициентами, тогда нулевая модель должна быть первой моделью, которую я написал выше. Степень свободы для теста составляет .6

макрос
источник
S1gls(Sepal.Length ~ species:Petal.Width, data = iris)
S1α0+α4пяspeciesgls(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. Какой простой и эффективный способ представить эти сравнения?
«Мы использовали линейную регрессию для сравнения соотношения длины чашелистика и ширины лепестка для каждого вида. Мы не обнаружили существенного взаимодействия в соотношениях длины чашечки и ширины лепестка для I. Setosa (B = 0,9), I. Versicolor (B = 1,4), ни I. Virginica (B = 0,6); F (2, 144) = 1,6, p = 0,19. Сравнение r-to-z Фишера показало, что корреляция Пирсона для I. Setosa (r = 0.28) была значительно ниже (р = 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

Я согласен с предыдущим предложением. Вы должны установить модель множественной регрессии с фиктивной переменной для каждого набора данных. Это позволит вам проверить, отличаются ли перехваты. Если вы также хотите узнать, отличаются ли уклоны , то вам также необходимо включить взаимодействия между манекенами и рассматриваемой переменной. Нет проблем с тем, что данные независимы. Обратите внимание, что если оба они являются независимыми и (например) разными видами, то вы не сможете определить, связано ли обнаруженное вами различие с разными видами или различными наборами данных, поскольку они совершенно запутаны. Тем не менее, нет теста / карта без выхода из тюрьмы, которая поможет вам решить эту проблему без сбора нового образца и повторного проведения исследования.

Gung - Восстановить Монику
источник
Похоже, мы опубликовали довольно похожие ответы практически в одно и то же время. +1
Макрос
@Macro, да, но ваш в основном лучше (+1 раньше); Вы ответили на все 3 вопроса, которые я пропустил при первом (не тщательном) прочтении вопроса. Мой вклад здесь - часть о путанице.
gung - Восстановить Монику
да, это хороший момент. Я полагаю, что если бы вы вообще делали этот запрос, вам бы пришлось работать в предположении, что наборы данных измеряли одно и то же и т. Д., С той лишь разницей, что виды были разными.
Макро
3
По моему мнению, вы оба должны получить голос против, и это то, чем я занимаюсь.
Майкл Р. Черник
1
Рекомендуется использовать фиктивную переменную при условии, что дисперсия ошибок не отличается заметно между моделями. В противном случае вы можете применить t-критерий Саттертвэйта-Уэлча (который имеет единственное преимущество в том, что он доступен, когда известны только сводные статистические данные, как это часто бывает при чтении опубликованных работ), или использовать взвешенные наименьшие квадраты для соответствия комбинированной модели.
whuber