2014-05-13 9 views
5

Ho installato un modello in R con la funzione lmer() dal pacchetto lme4. Ho scalato la variabile dipendente:Come svalutare i coefficienti da un lmer() - modello dotato di una risposta in scala

mod <- lmer(scale(Y) 
       ~ X 
       + (X | Z), 
       data = df, 
       REML = FALSE) 

guardo i coefficienti effetto fisso con fixef(mod):

> fixef(mod) 
    (Intercept)  X1   X2   X3   X4 
    0.08577525 -0.16450047 -0.15040043 -0.25380073 0.02350007 

È abbastanza facile calcolare i mezzi a mano dai coefficienti effetti fissi. Tuttavia, voglio che non siano scalati e non sono sicuro di come farlo esattamente. Sono consapevole del fatto che ridimensionare significa sottrarre la media da ogni Y e dividere per la deviazione standard. Ma entrambi, media e deviazione standard, sono stati calcolati dai dati originali. Posso semplicemente invertire questo processo dopo aver montato un modello lmer() utilizzando la media e la deviazione standard dei dati originali?

Grazie per qualsiasi aiuto!


Update: Il modo in cui ho presentato il modello di cui sopra sembra implicare che la variabile dipendente viene scalato prendendo la media su tutte le risposte e dividendo per la deviazione standard di tutte le risposte. Di solito, è fatto in modo diverso. Piuttosto che prendere la media e la deviazione standard, le risposte sono standardizzate per soggetto usando la deviazione media e standard delle risposte di quel soggetto. (Questo è strano in un lmer() Penso che l'intercettazione casuale dovrebbe occuparsi di questo ... Per non parlare del fatto che stiamo parlando di calcolare i mezzi su una scala ordinale ...) Il problema rimane lo stesso: una volta I montato un tale modello, c'è un modo pulito per ridimensionare i coefficienti del modello montato?

+0

non sono sicuro che ci sia un modo semplice per "non-scala", quest'ultimo Operazi re (cioè ridimensionando ogni soggetto separatamente) - questo mi sembra davvero un modello diverso per me ... Non sono del tutto sicuro del perché tu voglia ... –

+1

Lo sospettavo. Non importa come ho scritto il modello, non ho trovato un modo ragionevole per ridimensionarlo. Sono abbastanza d'accordo che questa procedura sia strana. Ma può essere trovato in alcuni documenti. Non capisco perché dovresti uniformare la risposta per argomento e permettere intercettazioni casuali. Sembra che due cose risolvano lo stesso problema; forse anche sottovalutando le corrette differenze individuali. Ma grazie mille per aver cercato di trovare una risposta! –

risposta

6

Aggiornamento: generalizzato per consentire il ridimensionamento della risposta e dei predittori.

Ecco un'implementazione abbastanza approssimativa.

Se il nostro (non in scala) di regressione originale è

Y = b0 + b1*x1 + b2*x2 ... 

Allora la nostra regressione scala è

(Y0-mu0)/s0 = b0' + (b1'*(1/s1*(x1-mu1))) + b2'*(1/s2*(x2-mu2))+ ... 

Ciò equivale a

Y0 = mu0 + s0((b0'-b1'/s1*mu1-b2'/s2*mu2 + ...) + b1'/s1*x1 + b2'/s2*x2 + ...) 

Così bi = s0*bi'/si per i>0 e

0.123.516,410617 millions
b0 = s0*b0'+mu0-sum(bi*mui) 

Implementare questo:

rescale.coefs <- function(beta,mu,sigma) { 
    beta2 <- beta ## inherit names etc. 
    beta2[-1] <- sigma[1]*beta[-1]/sigma[-1] 
    beta2[1] <- sigma[1]*beta[1]+mu[1]-sum(beta2[-1]*mu[-1]) 
    beta2 
} 

provarlo per un modello lineare:

m1 <- lm(Illiteracy~.,as.data.frame(state.x77)) 
b1 <- coef(m1) 

fare una versione in scala dei dati:

ss <- scale(state.x77) 

coefficienti Scaled:

m1S <- update(m1,data=as.data.frame(ss)) 
b1S <- coef(m1S) 

Ora provare ridimensionamento:

icol <- which(colnames(state.x77)=="Illiteracy") 
p.order <- c(icol,(1:ncol(state.x77))[-icol]) 
m <- colMeans(state.x77)[p.order] 
s <- apply(state.x77,2,sd)[p.order] 
all.equal(b1,rescale.coefs(b1S,m,s)) ## TRUE 

questo presuppone che sia la risposta ei predittori sono scalati.

  • Se si scala solo la risposta e non i predittori, allora si dovrebbe presentare (c(mean(response),rep(0,...)) per m e c(sd(response),rep(1,...)) per s (vale a dire, m e s sono i valori con cui le variabili sono stati spostati e scalato).
  • Se si scala solo i predittori e non la risposta, quindi inviare c(0,mean(predictors)) per m e c(1,sd(predictors)) per s.
+1

Sembra che abbiate ridimensionato le variabili indipendenti 'icol <- che (colnames (state.x77) ==" Analfabetismo ")', 'ss <- state.x77',' ss [, - icol] <- scale (ss [, -icol]) '. Ma ho ridimensionato la variabile dipendente nella progettazione. Quindi quello che ho fatto usando i dati 'state.x77' è:' m1Sy <- lm (scale (Illiteracy) ~., As.data.frame (state.x77)) '. Ora ottengo coefficienti z-trasformati nell'output del modello e voglio invertire questo per tracciare i mezzi sulla scala originale. Ma forse sto interpretando male la tua soluzione. –

+0

E nel caso in cui qualche background sia utile: sembra esserci una forte tendenza a scalare le risposte ordinali e adattare un 'lmer()' su di esso in alcune discipline. Non solo che dubito che questo sia giustificato (variabile ordinale) ma mi trovo a chiedere come recuperino la scala originale, ad es. quando si traccia la media (valutazione) e le barre di errore.Fortemente correlato: ['lmer()' vs 'clmm()' con risposta ordinale] (http://stats.stackexchange.com/questions/97582/linear-mixed-effect-model-vs-ordered-probit-vs- order-logit-with-ordinal-resp) –

+0

oops, risponde alla domanda sbagliata - tornerà su questo. –

Problemi correlati