Simula la regressione lineare con l'eteroscedasticità


9

Sto cercando di simulare un set di dati che corrisponde ai dati empirici che ho, ma non sono sicuro di come stimare gli errori nei dati originali. I dati empirici includono l'eteroscedasticità, ma non mi interessa trasformarlo via, ma piuttosto usare un modello lineare con un termine di errore per riprodurre simulazioni dei dati empirici.

Ad esempio, supponiamo che io abbia un set di dati empirici e un modello:

n=rep(1:100,2)
a=0
b = 1
sigma2 = n^1.3
eps = rnorm(n,mean=0,sd=sqrt(sigma2))
y=a+b*n + eps
mod <- lm(y ~ n)

usando plot(n,y)otteniamo quanto segue. inserisci qui la descrizione dell'immagine

Tuttavia, se provo a simulare i dati simulate(mod), l'eteroscedasticità viene rimossa e non acquisita dal modello.

Posso usare un modello di minimi quadrati generalizzato

VMat <- varFixed(~n)
mod2 = gls(y ~ n, weights = VMat)

che fornisce un migliore adattamento del modello basato su AIC, ma non so come simulare i dati usando l'output.

La mia domanda è: come posso creare un modello che mi permetta di simulare i dati per abbinare i dati empirici originali (ney sopra). In particolare, ho bisogno di un modo per stimare sigma2, l'errore, utilizzando uno dei due modelli?


1
Quindi il modello lineare non catturerà l'eteroschedasticità condizionale a meno che non provi esplicitamente a farlo, usando uno dei pochi approcci. Le tecniche econometriche standard regolano gli errori standard sui parametri per tenere conto dell'eteroschedasticità, ma non lo modellano esplicitamente.
generic_user

Hai ragione. Sto cercando di utilizzare un modello lineare per catturare l'eterogeneità. Penso che dovrei usare un modello dei minimi quadrati generalizzati. Se ci sono altri consigli, li proverò.
user44796,

C'È UN ERRORE NEL TUO CODICE, DEVI UTILIZZARE `lm (y ~ n)`
kjetil b halvorsen

1
Non capisco la tua domanda, perché il tuo codice realizza esattamente ciò che sembri chiedere nel suo titolo: simula una regressione lineare con errori eteroscedastici. Stai chiedendo metodi per stimare una sorta di modello per l'eteroscedasticità? In tal caso, è necessario specificare un modello!
whuber

Spero di aver chiarito la mia domanda con le modifiche. Nella domanda sopra, ney rappresentano i dati empirici. Voglio adattare un modello ai dati e quindi utilizzare il modello per generare dati simulati che corrispondano alla media e ai residui dei dati originali.
user44796,

Risposte:


9

Per simulare i dati con una varianza di errore variabile, è necessario specificare il processo di generazione dei dati per la varianza di errore. Come è stato sottolineato nei commenti, lo hai fatto quando hai generato i tuoi dati originali. Se hai dati reali e vuoi provarlo, devi solo identificare la funzione che specifica come la varianza residua dipende dalle tue covariate. Il modo standard per farlo è quello di adattare il modello, verificare che sia ragionevole (diverso dall'eteroscedasticità) e salvare i residui. Quei residui diventano la variabile Y di un nuovo modello. Di seguito l'ho fatto per il tuo processo di generazione dei dati. (Non vedo dove hai impostato il seme casuale, quindi questi non saranno letteralmente gli stessi dati, ma dovrebbero essere simili e puoi riprodurre il mio esattamente usando il mio seme.)

set.seed(568)  # this makes the example exactly reproducible

n      = rep(1:100,2)
a      = 0
b      = 1
sigma2 = n^1.3
eps    = rnorm(n,mean=0,sd=sqrt(sigma2))
y      = a+b*n + eps
mod    = lm(y ~ n)
res    = residuals(mod)

windows()
  layout(matrix(1:2, nrow=2))
  plot(n,y)
  abline(coef(mod), col="red")
  plot(mod, which=3)

inserisci qui la descrizione dell'immagine

Nota che R' plot.lm ti fornirà una trama (vedi qui ) della radice quadrata dei valori assoluti dei residui, utilmente sovrapposta con un adattamento lowess, che è proprio quello di cui hai bisogno. (Se si dispone di più covariate, è possibile valutare separatamente ogni covariata.) C'è il minimo accenno di curva, ma sembra che una linea retta faccia un buon lavoro di adattamento dei dati. Quindi adattiamo esplicitamente quel modello:

res.mod = lm(sqrt(abs(res))~fitted(mod))
summary(res.mod)
# Call:
# lm(formula = sqrt(abs(res)) ~ fitted(mod))
# 
# Residuals:
#     Min      1Q  Median      3Q     Max 
# -3.3912 -0.7640  0.0794  0.8764  3.2726 
# 
# Coefficients:
#             Estimate Std. Error t value Pr(>|t|)    
# (Intercept) 1.669571   0.181361   9.206  < 2e-16 ***
# fitted(mod) 0.023558   0.003157   7.461 2.64e-12 ***
# ---
# Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
# 
# Residual standard error: 1.285 on 198 degrees of freedom
# Multiple R-squared:  0.2195,  Adjusted R-squared:  0.2155 
# F-statistic: 55.67 on 1 and 198 DF,  p-value: 2.641e-12
windows()
  layout(matrix(1:4, nrow=2, ncol=2, byrow=TRUE))
  plot(res.mod, which=1)
  plot(res.mod, which=2)
  plot(res.mod, which=3)
  plot(res.mod, which=5)

inserisci qui la descrizione dell'immagine

Non dobbiamo preoccuparci che la varianza residua sembri essere in aumento anche nel diagramma della scala per questo modello - ciò deve essenzialmente avvenire. C'è di nuovo il minimo accenno di una curva, quindi possiamo provare ad adattare un termine al quadrato e vedere se questo aiuta (ma non lo fa):

res.mod2 = lm(sqrt(abs(res))~poly(fitted(mod), 2))
summary(res.mod2)
# output omitted
anova(res.mod, res.mod2)
# Analysis of Variance Table
# 
# Model 1: sqrt(abs(res)) ~ fitted(mod)
# Model 2: sqrt(abs(res)) ~ poly(fitted(mod), 2)
#   Res.Df    RSS Df Sum of Sq     F Pr(>F)
# 1    198 326.87                          
# 2    197 326.85  1  0.011564 0.007 0.9336

Se ne siamo soddisfatti, ora possiamo utilizzare questo processo come componente aggiuntivo per simulare i dati.

set.seed(4396)  # this makes the example exactly reproducible
x = n
expected.y = coef(mod)[1] + coef(mod)[2]*x
sim.errors = rnorm(length(x), mean=0,
                   sd=(coef(res.mod)[1] + coef(res.mod)[2]*expected.y)^2)
observed.y = expected.y + sim.errors

Si noti che questo processo non è più garantito per trovare il vero processo di generazione dei dati rispetto a qualsiasi altro metodo statistico. È stata utilizzata una funzione non lineare per generare le SD di errore e l'abbiamo approssimata con una funzione lineare. Se conosci effettivamente il vero processo di generazione dei dati a priori (come in questo caso, perché hai simulato i dati originali), potresti anche usarli. Puoi decidere se l'approssimazione qui è abbastanza buona per i tuoi scopi. In genere non conosciamo il vero processo di generazione dei dati, tuttavia, e in base al rasoio di Occam, utilizziamo la funzione più semplice che si adatta adeguatamente ai dati a cui abbiamo fornito la quantità di informazioni disponibili. Puoi anche provare spline o approcci più elaborati, se preferisci. Le distribuzioni bivariate sembrano ragionevolmente simili a me,

inserisci qui la descrizione dell'immagine


Questa era in realtà una conclusione a cui stavo per arrivare, ma non sarei mai arrivato a una risposta così elegante.
user44796,

5

Devi modellare l'eteroschedasticità. Un approccio è tramite il pacchetto R (CRAN) dglm, modello lineare generalizzato a dispersione. Questa è un'estensione di glm che, oltre al solito glm, si adatta a una seconda glm per la dispersione dai residui della prima glm. Non ho esperienza con tali modelli, ma sembrano promettenti ... Ecco un po 'di codice:

n <- rep(1:100,2)
a <- 0
b <- 1
sigma2 <- n^1.3
eps <- rnorm(n,mean=0,sd=sqrt(sigma2))
y <- a+b*n + eps
mod <- lm(y ~ n)

library(dglm)  ### double glm's

mod2   <-  dglm(y ~ n, ~ n, gaussian,ykeep=TRUE,xkeep=TRUE,zkeep=TRUE)
### This uses log link for the dispersion part, should also try identity link ..

y2 <-  simulate(mod2)

plot(n, y2$sim_1)

mod3  <-  dglm(y ~ n, ~ n, gaussian, dlink="identity", ykeep=TRUE,xkeep=TRUE,zkeep=TRUE)  ### This do not work because it leads to negative weights!

Il diagramma simulato è mostrato di seguito:

inserisci qui la descrizione dell'immagine

La trama sembra che la simulazione abbia usato la varianza stimata, ma non sono sicuro, poiché la funzione simulate () non ha metodi per dglm ...

(Un'altra possibilità da esaminare è l'utilizzo del Rpacchetto gamlss, che utilizza un altro approccio per modellare la varianza in funzione delle covariabili.)


1
il doppio modello lineare generalizzato sembra modellare adeguatamente i dati originali. Non sono chiaro su come modellare l'errore residuo usando predict (). Dovrò esaminarlo.
user44796,
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.