Để mô phỏng dữ liệu với phương sai lỗi khác nhau, bạn cần chỉ định quy trình tạo dữ liệu cho phương sai lỗi. Như đã được chỉ ra trong các ý kiến, bạn đã làm điều đó khi bạn tạo dữ liệu gốc của mình. Nếu bạn có dữ liệu thực và muốn thử điều này, bạn chỉ cần xác định hàm xác định phương sai dư phụ thuộc vào hiệp phương sai của bạn. Cách tiêu chuẩn để làm điều đó là phù hợp với mô hình của bạn, kiểm tra xem nó có hợp lý không (khác với độ không đồng nhất) và lưu phần dư. Những phần dư đó trở thành biến Y của một mô hình mới. Dưới đây tôi đã làm điều đó cho quá trình tạo dữ liệu của bạn. (Tôi không thấy nơi bạn đặt hạt giống ngẫu nhiên, vì vậy những dữ liệu này sẽ không phải là cùng một dữ liệu, nhưng sẽ giống nhau và bạn có thể sao chép chính xác hạt giống của mình bằng cách sử dụng hạt giống của tôi.)
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)
Lưu ý rằng R
, cốt truyện.lm sẽ cung cấp cho bạn một âm mưu (xem, ở đây ) căn bậc hai của các giá trị tuyệt đối của phần dư, được phủ một cách hữu ích với sự phù hợp thấp, đó là thứ bạn cần. (Nếu bạn có nhiều hiệp phương sai, bạn có thể muốn đánh giá điều này với từng hiệp phương riêng biệt.) Có một gợi ý nhỏ nhất về đường cong, nhưng có vẻ như một đường thẳng thực hiện tốt việc khớp dữ liệu. Vì vậy, hãy phù hợp rõ ràng với mô hình đó:
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)
Chúng ta không cần phải lo lắng rằng sự chênh lệch còn lại dường như đang gia tăng trong âm mưu vị trí tỷ lệ cho mô hình này cũng như điều mà về cơ bản phải xảy ra. Lại có một gợi ý nhỏ nhất về đường cong, vì vậy chúng ta có thể thử điều chỉnh một thuật ngữ bình phương và xem điều đó có giúp ích gì không (nhưng nó không):
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
Nếu chúng tôi hài lòng với điều này, giờ đây chúng tôi có thể sử dụng quy trình này như một tiện ích bổ sung để mô phỏng dữ liệu.
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
Lưu ý rằng quy trình này không được đảm bảo để tìm quá trình tạo dữ liệu thực sự hơn bất kỳ phương pháp thống kê nào khác. Bạn đã sử dụng hàm phi tuyến tính để tạo các SD lỗi và chúng tôi đã tính gần đúng với hàm tuyến tính. Nếu bạn thực sự biết quy trình tạo dữ liệu thực sự a-prori (như trong trường hợp này, vì bạn đã mô phỏng dữ liệu gốc), bạn cũng có thể sử dụng nó. Bạn có thể quyết định nếu xấp xỉ ở đây là đủ tốt cho mục đích của bạn. Tuy nhiên, chúng tôi thường không biết quy trình tạo dữ liệu thực sự và dựa trên dao cạo của Occam, với chức năng đơn giản nhất phù hợp với dữ liệu chúng tôi đã cung cấp cho lượng thông tin có sẵn. Bạn cũng có thể thử phương pháp splines hoặc fancier nếu bạn thích. Các bản phân phối bivariate trông tương tự như tôi,