Um Daten mit einer variierenden Fehlervarianz zu simulieren, müssen Sie den Datengenerierungsprozess für die Fehlervarianz angeben. Wie in den Kommentaren erwähnt, haben Sie dies getan, als Sie Ihre Originaldaten generiert haben. Wenn Sie echte Daten haben und dies versuchen möchten, müssen Sie nur die Funktion identifizieren, die angibt, wie die Restvarianz von Ihren Kovariaten abhängt. Die Standardmethode hierfür besteht darin, Ihr Modell anzupassen, zu überprüfen, ob es angemessen ist (abgesehen von der Heteroskedastizität), und die Residuen zu speichern. Diese Residuen werden zur Y-Variablen eines neuen Modells. Unten habe ich das für Ihren Datengenerierungsprozess getan. (Ich sehe nicht, wo Sie den zufälligen Startwert festgelegt haben, daher sind dies nicht buchstäblich dieselben Daten, sondern sollten ähnlich sein, und Sie können meinen genau reproduzieren, indem Sie meinen Startwert verwenden.)
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)
Beachten Sie, dass R
‚s ? Plot.lm geben Ihnen einen Plot (vgl hier ) der Quadratwurzel der absoluten Werte der Residuen, helfend mit einem Lowess fit überlagert, was genau das , was Sie brauchen. (Wenn Sie mehrere Kovariaten haben, möchten Sie dies möglicherweise für jede Kovariate separat bewerten.) Es gibt den geringsten Hinweis auf eine Kurve, aber dies sieht so aus, als ob eine gerade Linie die Daten gut anpasst. Passen wir also explizit dieses Modell an:
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)
Wir brauchen uns keine Sorgen zu machen, dass die Restvarianz auch für dieses Modell im Skalenortungsdiagramm zuzunehmen scheint - das muss im Wesentlichen geschehen. Es gibt wieder den geringsten Hinweis auf eine Kurve, sodass wir versuchen können, einen quadratischen Term anzupassen und zu sehen, ob dies hilft (aber nicht):
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
Wenn wir damit zufrieden sind, können wir diesen Prozess jetzt als Add-On verwenden, um Daten zu simulieren.
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
Beachten Sie, dass bei diesem Prozess nicht mehr garantiert wird, dass er den tatsächlichen Datengenerierungsprozess findet als bei jeder anderen statistischen Methode. Sie haben eine nichtlineare Funktion verwendet, um die Fehler-SDs zu generieren, und wir haben sie mit einer linearen Funktion approximiert. Wenn Sie den tatsächlichen Datengenerierungsprozess a priori kennen (wie in diesem Fall, weil Sie die Originaldaten simuliert haben), können Sie ihn auch verwenden. Sie können entscheiden, ob die Annäherung hier für Ihre Zwecke gut genug ist. Wir kennen jedoch normalerweise den tatsächlichen Prozess der Datengenerierung nicht und verwenden basierend auf Occams Rasiermesser die einfachste Funktion, die den Daten, die wir angesichts der verfügbaren Informationsmenge angegeben haben, angemessen entspricht. Sie können auch Splines oder schickere Ansätze ausprobieren, wenn Sie dies bevorzugen. Die bivariaten Verteilungen sehen mir ziemlich ähnlich,