Domanda:
Calcolo dell'R-quadrato (coefficiente di determinazione) con somme di quadrati centrate rispetto a non centrate
BenDundee
2012-09-11 02:30:44 UTC
view on stackexchange narkive permalink

Sto esaminando alcuni semplici modelli di regressione che utilizzano sia R che il pacchetto statsmodels di Python. Ho scoperto che, durante il calcolo del coefficiente di determinazione, statmodels utilizza la seguente formula per $ R ^ 2 $: $$ R ^ 2 = 1 - \ frac {SSR} {TSS} ~~ ~~~~ (\ text {centered}) $$ dove $ SSR $ è la somma dei quadrati dei residui e $ TSS $ è la somma totale dei quadrati del modello. ("Centrato" significa che la media è stata rimossa dalla serie.) Tuttavia, lo stesso calcolo in R produce un risultato diverso per $ R ^ 2 $. Il motivo è che R sembra calcolare $ R ^ 2 $ come: $$ R ^ 2 = 1 - \ frac {SSR} {TSS} ~~~ (\ text {uncentered}) $$ Allora, cosa dà? Presumibilmente c'è qualche motivo per preferire l'uno all'altro in determinate situazioni. Non sono stato in grado di trovare informazioni online sui casi in cui dovrebbe essere preferita una delle formule di cui sopra.

Qualcuno può spiegare perché uno è migliore dell'altro?

Qual è il modello che usi in R? Include un'intercetta? La seconda formula è quella corretta quando non c'è interecept.
Giusto per chiarire, la documentazione di statsmodels afferma che rsquared è per un modello che include una costante. http://statsmodels.sourceforge.net/devel/generated/statsmodels.regression.linear_model.RegressionResults.html
Ho capito che la definizione di $ R ^ 2 $ è diversa, quello che non ho capito è perché.
Puoi darci il codice che stai usando? Soprattutto in R, ci sono molti modi diversi per calcolare un modello di regressione.
Codice R: lm (y ~ x + 0), quindi riepilogo, quindi guarda il valore R ^ 2.
Quattro risposte:
Dirk Eddelbuettel
2012-09-11 06:20:56 UTC
view on stackexchange narkive permalink

Come ha accennato Stephane nel commento, è la differenza tra il modello con o senza intercettare che conta.

Per quello che vale, ecco il codice da uno dei miei pacchetti:

  ## cf src / library / stats / R / lm.R e case senza pesi e un oggetto intercetta <- $ fitting.valuesr <- oggetto $ residualsmss <- if (object $ intercept) sum ((f - mean (f)) ^ 2) else sum (f ^ 2) rss <- sum (r ^ 2) r. quadrato <- mss / (mss + rss)  

I residui sono centrati in base alla progettazione, lascia i valori adattati con la necessità di essere centrati nell'intercetta e non altrimenti.

+1, bel punto. In questo senso, vale la pena dare un'occhiata all'eccellente risposta di @cardinal's qui: [removal-of-statistically-significative-intercept-term-boosts-r2] (http://stats.stackexchange.com/questions/26176//26205# 26205).
I colori fanno schifo e non so se ho controllato la tua risposta. L'ho cliccato un numero casuale di volte (ormai), se a questo punto non ricevi il credito appropriato, commenta qui e farò clic ancora una volta :)
BenDundee
2012-09-18 00:37:40 UTC
view on stackexchange narkive permalink

Ok, ho pensato di dare seguito a questo. Ho lottato un po 'con le risposte qui e sono arrivato a una migliore comprensione del problema. Per i posteri, penso anche che una spiegazione completa del perché ci sono due diverse forme di questa equazione per R ^ 2 sarebbe vantaggiosa per chiunque si imbattesse in questo filo. Non so se questa sia conoscenza comune, o cosa - nessuno sembra spiegare (forse molte persone semplicemente non lo sanno, o forse è così semplice che ci si aspetta che le persone `` sappiano '') PERCHÉ ci sono due forme per R ^ 2. Ciò include diverse serie di dispense di professori delle principali università: forse non sto solo cercando nei posti giusti.

Il motivo delle due diverse equazioni di cui sopra deriva dal fatto che stai confrontando modello contro l'ipotesi nulla. L'ipotesi nulla è "esiste una relazione zero tra le variabili dipendenti e indipendenti". Ciò significa che stai assumendo che la pendenza sia zero. Un altro modo per dirlo è che stai confrontando il modello di regressione che costruisci con un modello nidificato con un parametro in meno.

Ora, supponiamo di avere un insieme di dati con uno variabile indipendente (x) e una variabile dipendente (y). Abbiamo due scelte:

  • Scegliamo di modellare la relazione tra x e y con un modello lineare a due parametri (cioè $ \ hat {y} _i = a_0 + a_1 \ hat {x} _i + \ epsilon_i $). L'ipotesi nulla è $ \ hat {y} _i = a_0 + \ epsilon_i $ e $ \ bar {y} \ neq 0 $ in generale. Quindi la forma appropriata di $ R ^ 2 $ da usare è: $$ R ^ 2 = 1- \ frac {\ sum_i (y_i - \ hat {y} _i) ^ 2} {\ sum_i (y_i - \ bar {y }) ^ 2} $$
  • Scegliamo di modellare la relazione tra x e y con un modello lineare a un parametro , ovvero $ \ hat {y} _i = a_1 \ hat {x} _i + \ epsilon_i $. L'ipotesi nulla è che non vi sia alcuna relazione tra x e y, quindi l'ipotesi nulla corretta è $ \ hat {y} _i = \ epsilon_i $. In altre parole, l'ipotesi nulla è solo rumore bianco. Chiaramente, $ \ mathbb {E} (y) = 0 $, quindi la forma corretta di $ R ^ 2 $ è $$ R ^ 2 = 1- \ frac {\ sum_i (y_i - \ hat {y} _i) ^ 2} {\ sum_i y_i ^ 2} $$

Un buon modo di pensare questa è la seguente: supponiamo che l'ipotesi nulla fosse corretta (100%) e che non ci fosse davvero alcuna relazione tra x e y. Cosa ci aspetteremmo? Se qualcosa è giusto, la risposta è "Ci aspettiamo $ R ^ 2 = 0 $."

  • Nel caso in cui scegliamo un modello a due parametri, ci aspettiamo che $ \ bar {y} = \ hat {y} _i = a_0 $. Se questo non è ovvio, prova a disegnare l'immagine con il valore del modello sotto l'ipotesi nulla $ \ hat {y} _i $, il punto dati come $ y_i $ e la media $ \ bar {y} $. Se il modello è corretto (cioè, numero di punti dati -> infinito), dovresti essere in grado di vedere graficamente che $ \ bar {y} = \ hat {y} _i = a_0 $, nel caso in cui l'ipotesi nulla è vera .
  • Al contrario, usando la stessa immagine di sopra, $ \ hat {y} _i = \ bar {y} = 0 $. C'è un leggero fastidio qui, perché devi preoccuparti di come queste cose vanno a zero. L'Hopital ti dirà che, almeno in questo caso, $ \ lim 0/0 = 0 $, e va tutto bene.

Puoi capire perché succedono cose divertenti con $ R ^ 2 $ (come i valori negativi) se usi la forma sbagliata dell'equazione. L'ho notato per primo perché il pacchetto statsmodels in Python fa una cosa e R fa qualcos'altro: mi fa male dirlo, ma R lo è giusto e statsmodels è sbagliato. (Beh, non proprio "dolori" ...)

Mi piacerebbe avere un feedback su questa intuizione. Ho trovato solo un riferimento in cui questo è spiegato esplicitamente. Vedere questo file pdf ( scarica qui), Sezione 5.3.6. Inoltre, l'altra risposta collegata su stackexchange allude a questo fatto, ma il ragionamento non mi era del tutto chiaro (senza offesa per la persona che ha risposto alla domanda, è una risposta molto ben scritta , e posso essere ottuso a volte!).

Di nuovo, correggi il mio ragionamento nei commenti e modificherò il post finché non sarà accettabile.

Questo è un bel saggio :)
Ho pensato che mi costava abbastanza capelli ... non c'è bisogno che qualcun altro diventi calvo per questo problema :)
EnricoGiampieri
2013-03-14 23:50:01 UTC
view on stackexchange narkive permalink

Immagino che, come ha accennato Stephane nel commento, tutta la differenza sia nel modo in cui descrivi il tuo modello. Se descrivi lo stesso modello, la r al quadrato sarà la stessa in entrambi i casi.

In seguito posterò del codice python per dimostrarlo, ma prima una parola di cautela: statsmodels, con la funzione OLS do non aggiungere automaticamente l'intercetta, mentre la formula R lo farà, quindi questa potrebbe essere l'origine della tua differenza. Se questo ti mette a disagio, prova a utilizzare la nuova sintassi della formula.

Con il seguente codice puoi verificare che il bot ti dia lo stesso valore (statsmodels è effettivamente testato per dare gli stessi risultati di R)

  # crea i dati per statsmodelsimport statsmodels.formula.api come smfimport pandas as pd da pylab import arange, randnx = arange (20) y = x * 0.3 + randn (20) data = pd. DataFrame ({'x': x, 'y': y}) # crea i dati per Rpyimport rpy2.robjects come robjectsimport pandas.rpy.common as comr = robjects.rfrom rpy2.robjects import FloatVectorfrom rpy2.robjects.packages import importrstats = importr ('stats') base = importr ('base') robjects.globalenv ["x"] = FloatVector (x) robjects.globalenv ["y"] = FloatVector (y) # modello senza interceptlm0 = stats.lm ( "y ~ x + 0") s = base.summary (lm0) print s.rx2 ("r.squared") [0], smf.ols ('y ~ x + 0', data) .fit (). rsquaredprint s.rx2 ("adj.r.squared") [0], smf.ols ('y ~ x + 0', data) .fit (). rsquared_adj # modello con interceptlm0 = stats.lm ("y ~ x + 1 ") s = base.summary (lm0) print s.rx2 (" r.squared ") [0], smf.ols ('y ~ x + 1', data) .fit (). rsquaredprint s.rx2 (" adj.r.squared ") [0], smf.ols ('y ~ x + 1', data) .fit (). rsquared_adj  
Era davvero la fonte della differenza. Ho parlato un po 'con uno degli sviluppatori di statsmodels, e penso che la versione aggiornata (non ricordo i numeri di versione, ormai!) Si comporti come R --- cioè calcola il corretto R ^ 2, dato il modello .
Sì, immagino che al momento della domanda potrebbero effettivamente comportarsi in modo diverso. Ho solo scelto di rispondere solo per dare un aggiornamento sul problema. Statsmodels è IMHO una buona alternativa a Python per le statistiche e merita di essere promosso un po ':) btw, complimenti per la tua risposta, è stato davvero educativo
Leopold W.
2016-09-11 08:39:32 UTC
view on stackexchange narkive permalink

La mia comprensione è:

  • L ' R2 non centrato spiega il potere esplicativo di tutti i regressori (incluso il regressore costante).
  • L ' R2 centrato spiega il potere esplicativo di tutti i regressori non costanti.


Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...