Come applicare il termine coefficiente per fattori e termini interattivi in ​​un'equazione lineare?


9

Usando R, ho inserito un modello lineare per una singola variabile di risposta da un mix di predittori continui e discreti. Questo è estremamente semplice, ma ho difficoltà a capire come funziona un coefficiente per un fattore discreto.

Concetto: Ovviamente, il coefficiente della variabile continua 'x' viene applicato nella forma y = coefx(varx) + interceptma come funziona per un fattore z se il fattore non è numerico?y = coefx(varx) + coefz(factorz???) + intercept

Specifico: ho inserito un modello in R come lm(log(c) ~ log(d) + h + a + f + h:a)dove he fsono fattori discreti e non numerici. I coefficienti sono:

Coefficients:
              Estimate 
(Intercept)  -0.679695 
log(d)        1.791294 
h1            0.870735  
h2           -0.447570  
h3            0.542033   
a             0.037362  
f1           -0.588362  
f2            0.816825 
f3            0.534440
h1:a         -0.085658
h2:a         -0.034970 
h3:a         -0.040637

Come posso usarli per creare l'equazione predittiva:

log(c) =  1.791294(log(d)) + 0.037362(a) + h??? + f???? + h:a???? + -0.679695

O sto sbagliando?

PENSO che quel concetto sia se il soggetto rientra nella categoria h1e f2l'equazione diventa:

log(c) =  1.791294(log(d)) + 0.037362(a) +  0.870735  + 0.816825  + h:a???? + -0.679695

Ma non sono davvero chiaro su come h:avenga analizzato il termine interattivo. Grazie per essere andato piano con me.

Risposte:


14

Questo non è un problema specifico di R. R utilizza una visualizzazione convenzionale dei coefficienti.

Quando leggi questo output di regressione (in un documento, un libro di testo o da un software statistico), devi sapere quali variabili sono "continue" e quali "categoriche":

  • Quelli "continui" sono esplicitamente numerici e i loro valori numerici sono stati usati così come sono nel raccordo di regressione.

  • Le variabili "categoriche" possono essere di qualsiasi tipo, comprese quelle numeriche! Ciò che li rende categorici è che il software li ha trattati come "fattori": vale a dire, ogni valore distinto che viene trovato è considerato un indicatore di qualcosa di distinto.

    La maggior parte dei software considera i valori non numerici (come le stringhe) come fattori. La maggior parte dei software può essere persuasa a trattare anche i valori numerici come fattori. Ad esempio, un codice di servizio postale (codice postale negli Stati Uniti) sembra un numero ma in realtà è solo un codice per un set di cassette postali; non avrebbe senso aggiungere, sottrarre e moltiplicare i codici postali per altri numeri! (Questa flessibilità è la fonte di un errore comune: se non stai attento o inconsapevole, il tuo software potrebbe trattare una variabile che ritieni categorica come continua o viceversa. Fai attenzione!)

    Tuttavia, le variabili categoriali devono essere rappresentate in qualche modo come numeri per applicare gli algoritmi di adattamento. Esistono molti modi per codificarli . I codici vengono creati utilizzando "variabili fittizie". Scopri di più sulla codifica delle variabili fittizie cercando su questo sito; i dettagli non contano qui.

Nella domanda ci viene detto che he fsono valori categoriali ( "discreti"). Per impostazione predefinita, log(d)e asono continui. Questo è tutto ciò che dobbiamo sapere. Il modello è

y=0.679695+1.791294 log(d)+0.870735 if h=h10.447570 if h=h2+0.542033 if h=h3+0.037362 a0.588362 if f=f1+0.816825 if f=f2+0.534440 if f=f30.085658 a if h=h10.034970 a if h=h20.040637 a if h=h3

Le regole applicate qui sono:

  • Il termine "intercetta", se appare, è una costante additiva (prima riga).

  • Le variabili continue sono moltiplicati per i loro coefficienti, anche in "interazioni" , come la h1:a, h2:ae h3:acondizioni. (Questo risponde alla domanda originale.)

  • Qualsiasi variabile (o fattore) categoriale è inclusa solo per i casi in cui appare il valore di quel fattore.

log(d)=2h=h3a=1f=f2

y^=0.6797+1.7913×(2)+0.5420+0.0374×(1)+0.81680.0406×(1).

hh1h2h3(0.870735,0.447570,0.542033)h(0.085658,0.034970,0.040637)ah:ainterazione; allo stesso modo, si applica un solo coefficiente fin ogni caso particolare.


8

Questo è solo un commento ma non si adatta come tale nelle caselle di modifica limitate che abbiamo a nostra disposizione.

LATEX

Simuliamo prima alcuni dati,

n <- 200
x1 <- runif(n)
x2 <- runif(n)
x3 <- runif(n)
g1 <- gl(2, 100, n, labels=letters[1:2])
g2 <- cut2(runif(n), g=4)
y <- x1 + x2 + rnorm(200)

quindi inserire un modello di regressione,

f <- ols(y ~ x1 + x2 + x3 + g1 + g2 + x1:g1)

che produce i seguenti risultati:

Linear Regression Model

ols(formula = y ~ x1 + x2 + x3 + g1 + g2 + x1:g1)

                Model Likelihood     Discrimination    
                   Ratio Test           Indexes        
Obs      200    LR chi2     35.22    R2       0.161    
sigma 0.9887    d.f.            8    R2 adj   0.126    
d.f.     191    Pr(> chi2) 0.0000    g        0.487    

Residuals

    Min      1Q  Median      3Q     Max 
-3.1642 -0.7109  0.1015  0.7363  2.7342 

                   Coef    S.E.   t     Pr(>|t|)
Intercept           0.0540 0.2932  0.18 0.8541  
x1                  1.1414 0.3642  3.13 0.0020  
x2                  0.8546 0.2331  3.67 0.0003  
x3                 -0.0048 0.2472 -0.02 0.9844  
g1=b                0.2099 0.2895  0.73 0.4692  
g2=[0.23278,0.553)  0.0609 0.1988  0.31 0.7598  
g2=[0.55315,0.777) -0.2615 0.1987 -1.32 0.1896  
g2=[0.77742,0.985] -0.2107 0.1986 -1.06 0.2901  
x1 * g1=b          -0.2354 0.5020 -0.47 0.6396  

Quindi, per stampare l'equazione di regressione corrispondente, basta usare la latexfunzione generica , in questo modo:

latex(f)

Dopo la conversione del DVI in PNG, dovresti ottenere qualcosa del genere

inserisci qui la descrizione dell'immagine

IMO, questo ha il merito di mostrare come calcolare i valori previsti in base ai valori effettivi o scelti per i predittori numerici e categorici. Per quest'ultimo, i livelli dei fattori sono indicati tra parentesi vicino al coefficiente corrispondente.


1
+0.2099013{b}g1{b}g1=bbb01

1
@whuber L'immagine sopra è stata ritagliata ma c'è una specie di nota a piè di pagina che ricorda che "{c} = 1 se il soggetto è nel gruppo c, 0 altrimenti" (la scelta di cpotrebbe essere confusa in questo caso particolare, perché scelgo due lettere per rappresentano i livelli g1, ma di solito è abbastanza intuitivo - e questo è puro tex, quindi possiamo ancora modificare il file sorgente in seguito). In allegato è un altro riassunto in cui ho modificato in g1modo che ora sia un fattore a quattro livelli. Eppure, con etichette 0/1 che potrebbero essere più confuse .
chl

5

Puoi controllare i tuoi "contrasti" come predefiniti options()e cercando:

$contrasts
        unordered           ordered 
"contr.treatment"      "contr.poly" 

Se i tuoi contrasti non ordinati sono impostati come contr.treatment(come dovrebbero essere a meno che tu non li abbia modificati), il primo livello di ciascuno dei tuoi fattori verrà impostato come base. Ti verranno fornite solo stime per i coefficienti di fronte alle variabili fittizie create per altri livelli del fattore. In effetti, tali coefficienti saranno "quanto in media è diversa la variabile di risposta a questo livello del fattore, rispetto al livello di base del fattore, avendo controllato tutto il resto nel modello".

Immagino che dal tuo output ci sia un h0e f0che sono i livelli di base per h e f (a meno che tu non abbia un'opzione non predefinita per i contrasti, nel qual caso ci sono diverse possibilità; prova ?contr.treatmentad aiutare).

È simile con l'interazione. Se il mio paragrafo precedente è corretto, la stima fornita asarà davvero la pendenza per aquando h=h0. Le stime fornite nel riepilogo che si applicano alle interazioni indicano quanto cambia tale pendenza per diversi livelli di h.

Quindi nel tuo esempio dove h = h1 e f = f2, prova:

log(c) =  1.791294(log(d)) + (0.037362 - 0.085658) (a) +  0.870735  + 0.816825  -0.679695

Oh, e puoi usare predict()anche molte cose utili ... se in realtà vuoi predire qualcosa (piuttosto che scrivere l'equazione per un rapporto). Prova ?predict.lma vedere cosa predict()fa un oggetto creato da lm.


+1 (in realtà, l'ho votato un mese fa e mi è capitato di rileggerlo ora) in ogni caso, mi viene in mente che mi consiglia di controllare il tipo di contrasto options(). Dovrai scorrere un sacco di spazzatura per trovare quello che ti serve. Potresti provare options()$contrasts, che produrrà solo ciò che vuoi.
gung - Ripristina Monica

buon suggerimento, il mio cervello deve essere stato addormentato.
Peter Ellis,

Sai, spesso rispondo alle domande sul CV prima di andare a letto ...
gung - Reinstalla Monica
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.