Quale test posso usare per confrontare le pendenze di due o più modelli di regressione?


29

Vorrei testare la differenza in risposta di due variabili a un predittore. Ecco un esempio riproducibile minimo.

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")

Vedo che i coefficienti di pendenza sono diversi:

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 

Ho tre domande:

  1. Come posso verificare la differenza tra le piste?
  2. Come posso verificare la differenza tra varianze residue?
  3. Qual è un modo semplice ed efficace per presentare questi confronti?

Una domanda correlata, Metodo per confrontare il coefficiente variabile in due modelli di regressione , suggerisce di rieseguire il modello con una variabile fittizia per differenziare le pendenze, esistono opzioni che consentirebbero l'uso di set di dati indipendenti?


Per quanto riguarda la prima domanda, consultare stats.stackexchange.com/questions/55501/… .
Russellpierce,

Risposte:


22

Come posso verificare la differenza tra le piste?

PiLiPiS1,S2,S3

E(Li)=β0+β1Pi

Pi

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

logLik44

Qual è un modo semplice ed efficace per presentare il confronto?

Pi

Modifica: ho notato che un'altra domanda è stata aggiunta al corpo. Quindi, sto aggiungendo una risposta a questo:

Come posso verificare la differenza tra varianze residue?

Per questo, dovrai stratificare il set di dati e adattare modelli separati poiché, il modello basato sull'interazione che ho suggerito vincolerà la varianza residua in modo che sia la stessa in ogni gruppo. Se si adattano modelli separati, questo vincolo scompare. In tal caso, è ancora possibile utilizzare il test del rapporto di verosimiglianza (la verosimiglianza per il modello più grande viene ora calcolata sommando le verosimiglianze dai tre modelli separati). Il modello "null" dipende da cosa si desidera confrontare

  • 2

  • 6


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

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

@Macro Nice answer (+1)! Mi chiedo se si possa adattare il glsmodello ma consentendo diverse varianti residue per ciascuna specie con l'opzione weights=varIdent(form=~1|Species)(per quanto riguarda la seconda domanda)?
COOLSerdash

15

Per rispondere a queste domande con il codice R, utilizzare quanto segue:
1. Come posso verificare la differenza tra le pendenze?
Risposta: Esamina il valore p ANOVA dall'interazione di Petal.Width per specie, quindi confronta le pendenze usando lsmeans :: lstrends, come segue.

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. Come posso verificare la differenza tra varianze residue?
Se capisco la domanda, puoi confrontare le correlazioni di Pearson con una trasformata di Fisher, chiamata anche "r-to-z di Fisher", come segue.

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. Qual è un modo semplice ed efficace per presentare questi confronti?
"Abbiamo usato la regressione lineare per confrontare la relazione tra Lunghezza sepale e Larghezza petalo per ciascuna specie. Non abbiamo trovato un'interazione significativa nelle relazioni tra Lunghezza sepale e Larghezza petalo per I. Setosa (B = 0.9), I. Versicolor (B = 1,4), né I. Virginica (B = 0,6); F (2, 144) = 1,6, p = 0,19. Un confronto r-to-z di Fisher indicava che la correlazione di Pearson per I. Setosa (r = 0,28) era significativamente inferiore (p = 0,02) rispetto a I. Versicolor (r = 0,55) Analogamente, la correlazione per I. Virginica (r = 0,28) era significativamente più debole (p = 0,02) rispetto a quella osservata per I. Versicolor".

Infine, visualizza sempre i tuoi risultati!

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

Sono d'accordo con il suggerimento precedente. È necessario adattare un modello di regressione multipla con una variabile fittizia per ciascun set di dati. Ciò ti consentirà di verificare se le intercettazioni differiscono. Se vuoi anche sapere se le pendenze differiscono, devi includere anche le interazioni tra i manichini e la variabile in questione. Non vi è alcun problema con il fatto che i dati sono indipendenti. Si noti che se sono entrambe specie indipendenti e (ad esempio) diverse, non si sarebbe in grado di dire se la differenza che si trova è dovuta alle diverse specie o ai diversi set di dati, poiché sono perfettamente confusi. Tuttavia, non esiste un test / Carta esente da prigione che ti risolverà il problema senza raccogliere un nuovo campione ed eseguire nuovamente il tuo studio.


Sembra che abbiamo pubblicato risposte abbastanza simili quasi nello stesso momento. +1
Macro,

@Macro, sì, ma il tuo è per lo più migliore (+1 prima); hai affrontato tutte e 3 le domande che mi mancavano nella mia prima (non approfondita) lettura della domanda. Il mio contributo qui è la parte sul confondimento.
gung - Ripristina Monica

sì, questo è un buon punto. Suppongo che se avessi fatto questa inchiesta, avresti dovuto operare supponendo che i set di dati stessero misurando la stessa cosa, ecc ... con l'unica differenza che le specie erano diverse.
Macro,

3
Dal mio modo di pensare, entrambi dovreste ottenere voti che è quello che sto facendo.
Michael R. Chernick,

1
Il suggerimento variabile fittizio è valido a condizione che la varianza dell'errore non differisca in modo sensibile tra i modelli. Altrimenti potresti applicare un test t di Satterthwaite-Welch (che ha il singolare vantaggio di essere disponibile quando sono note solo statistiche riassuntive, come spesso accade quando si leggono articoli pubblicati) o usare i minimi quadrati ponderati per adattarsi al modello combinato.
whuber
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.