Confronta il significato statistico della differenza tra due regressioni polinomiali in R


10

Quindi, prima di tutto, ho fatto alcune ricerche su questo forum e so che sono state poste domande molto simili, ma di solito non hanno ricevuto una risposta corretta o, a volte, la risposta non è abbastanza dettagliata da poter essere compresa. Quindi questa volta la mia domanda è: ho due serie di dati, su ciascuno, faccio una regressione polinomiale in questo modo:

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

I grafici delle regressioni polinomiali sono:

inserisci qui la descrizione dell'immagine

I coefficienti sono:

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

E ora voglio sapere se esiste un modo per utilizzare una funzione R per eseguire un test che mi direbbe se esiste o meno un significato statistico nella differenza tra la regressione dei due polinomi sapendo che l'intervallo di giorni rilevante è [ 1100].

Da quello che ho capito non posso applicare direttamente il test anova perché i valori provengono da due diversi set di dati né dall'AIC, che viene utilizzato per confrontare i dati modello / dati reali.

Ho provato a seguire le istruzioni fornite da @Roland nella domanda correlata, ma probabilmente ho frainteso qualcosa guardando i miei risultati:

Ecco cosa ho fatto:

Ho combinato entrambi i miei set di dati in uno.

fè il fattore variabile di cui ha parlato @Roland. Ho messo 1s per il primo set e 0s per l'altro.

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

I miei dati ora appaiono così:

inserisci qui la descrizione dell'immagine

Quello rosso fit3ANOVAè ancora funzionante ma ho un problema con quello blufit3ANOVACN il modello ha risultati strani. Non so se il modello adatto sia corretto, non capisco cosa intendesse esattamente @Roland.

Considerando la soluzione @DeltaIV suppongo che in quel caso: inserisci qui la descrizione dell'immagine i modelli sono significativamente diversi anche se si sovrappongono. Ho ragione di assumerlo?


Mi sembra che il commento dell'utente @ Roland alla domanda a cui ti stai collegando, risponda perfettamente alla tua domanda. Cos'è esattamente che non capisci?
DeltaIV,

Bene un paio di cose, non ero sicuro che fosse o no questa era una risposta corretta dato che era nella sezione commenti, ma se funziona allora, devo solo essere sicuro di aver capito. Fondamentalmente, dovrei creare un nuovo set di dati in cui creo una colonna con 1 e 0 simili a seconda dei set di dati da cui provengono originariamente? Quindi, creo due modelli, uno con tutti i dati, l'altro con solo uno dei set di dati presi in considerazione. Quindi applico il test anova. È così? Inoltre non ho mai usato il test anova, ho visto che parlavano del valore p corretto quale sarebbe esattamente?
PaoloH,

1
[0,100]

Risposte:


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

Come vedi, fit1è significativamente migliore di fit0, cioè l'effetto della variabile di raggruppamento è significativo. Poiché la variabile di raggruppamento rappresenta i rispettivi set di dati, l'adattamento polinomiale ai due set di dati può essere considerato significativamente diverso.


Mi dispiace che questo debba essere ovvio, ma non ho familiarità con i risultati del test Anova cosa ci sta dicendo che fit1 è meglio di fit0? È il Pr (> F) che è estremamente basso?
PaoloH,

1
Il valore p indica se i modelli sono significativamente diversi (un valore p inferiore significa "più diverso" tenendo conto della variazione, generalmente p <0,05 è considerato significativo). Il RSS più piccolo indica il modello più adatto.
Roland,

@PaoloH A proposito, dovresti evitare i rapporti come variabili dipendenti. Ipotesi di modelli ordinari dei minimi quadrati non valgono con una variabile così dipendente.
Roland,

8

La risposta di @Ronald è la migliore ed è ampiamente applicabile a molti problemi simili (per esempio, c'è una differenza statisticamente significativa tra uomini e donne nella relazione tra peso ed età?). Tuttavia, aggiungerò un'altra soluzione che, pur non essendo quantitativa (non fornisce un valore p ), offre una bella visualizzazione grafica della differenza.

EDIT : secondo questa domanda , sembra che predict.lmla funzione utilizzata ggplot2per calcolare gli intervalli di confidenza, non calcoli le bande di confidenza simultanee attorno alla curva di regressione, ma solo le bande di confidenza puntuale. Queste ultime bande non sono quelle giuste per valutare se due modelli lineari montati sono statisticamente diversi, o hanno detto in un altro modo, se potrebbero essere compatibili con lo stesso modello reale o meno. Pertanto, non sono le curve giuste per rispondere alla tua domanda. Dal momento che apparentemente non c'è R incorporato per ottenere bande di confidenza simultanee (strano!), Ho scritto la mia funzione. Ecco qui:

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)

inserisci qui la descrizione dell'immagine

Le bande interne sono quelle calcolate per impostazione predefinita da geom_smooth: sono bande di confidenza puntuali del 95% attorno alle curve di regressione. Le bande esterne semitrasparenti (grazie per la punta grafica, @Roland) sono invece le bande di confidenza simultanee al 95%. Come puoi vedere, sono più grandi delle bande puntuali, come previsto. Il fatto che le bande di confidenza simultanee delle due curve non si sovrappongano può essere preso come un'indicazione del fatto che la differenza tra i due modelli è statisticamente significativa.

Naturalmente, per un test di ipotesi con un valore p valido , è necessario seguire l'approccio @Roland, ma questo approccio grafico può essere visto come analisi di dati esplorativi. Inoltre, la trama può darci alcune idee aggiuntive. È chiaro che i modelli per i due set di dati sono statisticamente diversi. Ma sembra anche che i modelli a due gradi 1 si adattino ai dati quasi come ai due modelli quadratici. Possiamo facilmente verificare questa ipotesi:

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

La differenza tra il modello di grado 1 e il modello di grado 2 non è significativa, quindi possiamo anche usare due regressioni lineari per ciascun set di dati.


3
+1 per la stampa. Una parte cruciale delle analisi statistiche.
Roland,

Giusto per essere sicuri, sul tuo metodo: il fatto che "gli intervalli di confidenza delle due curve non si sovrappongano può essere preso come un'indicazione del fatto che la differenza tra i due modelli è statisticamente significativa". Ma non posso dire che la differenza non sia significativa se si sovrappongono, giusto?
PaoloH,

Per essere più specifici ho aggiunto un esempio nel post.
PaoloH,

@PaoloH, poiché hai aggiunto una nuova trama alla tua domanda, aggiungerò un commento lì.
DeltaIV,
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.