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


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

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

Включите манекен для видов, дайте ему взаимодействовать с и посмотрите, ли этот манекен. Пусть - длина чашелистика, - ширина педали, а - фиктивные переменные для трех видов. Сравнить модель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

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


Похоже, мы опубликовали довольно похожие ответы практически в одно и то же время. +1
Макрос

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

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

3
По моему мнению, вы оба должны получить голос против, и это то, чем я занимаюсь.
Майкл Р. Черник

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