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