Nếu tôi hiểu chính xác câu hỏi của bạn, điều này khá dễ dàng. Bạn chỉ cần quyết định phân phối nào bạn muốn có lỗi và sử dụng hàm tạo ngẫu nhiên tương ứng.
Có một số phân phối sai lệch, vì vậy bạn cần tìm ra cái nào bạn thích. Ngoài ra, hầu hết các phân phối bị lệch (ví dụ: log bình thường, bình phương, Gamma, Weibull, v.v.) đều bị lệch, do đó, một số điều chỉnh nhỏ sẽ là cần thiết (ví dụ: nhân với ). - 1
Dưới đây là một ví dụ sửa đổi mã của bạn:
set.seed(5840) # this makes the example exactly reproducible
N <- 100
x <- rnorm(N)
beta <- 0.4
errors <- rlnorm(N, meanlog=0, sdlog=1)
errors <- -1*errors # this makes them left skewed
errors <- errors - 1 # this centers the error distribution on 0
y <- 1 + x*beta + errors
Tôi nên lưu ý vào thời điểm này rằng hồi quy không đưa ra bất kỳ giả định nào về phân phối của hoặc , chỉ về các lỗi, (xem tại đây: Điều gì xảy ra nếu phần dư được phân phối bình thường, nhưng y thì không? ). Vì vậy, đó là trọng tâm của câu trả lời của tôi ở trên. Y εXYε
Cập nhật: Đây là phiên bản sai lệch với các lỗi được phân phối là Weibull:
set.seed(5840) # this makes the example exactly reproducible
N <- 100
x <- rnorm(N)
beta <- 0.4
errors <- rweibull(N, shape=1.5, scale=1)
# errors <- -1*errors # this makes them left skewed
errors <- errors - factorial(1/1.5) # this centers the error distribution on 0
y <- 1 + x*beta + errors
Dữ liệu Weibull đã bị sai lệch, vì vậy chúng tôi không cần phải chuyển hướng của chúng (nghĩa là chúng tôi bỏ -1*errors
phần đó). Ngoài ra, từ trang Wikipedia cho phân phối Weibull, chúng tôi thấy rằng giá trị trung bình của một Weibull phải là:. Chúng tôi muốn trừ giá trị đó từ mỗi lỗi để phân phối lỗi kết quả được tập trung vào . Điều đó cho phép phần cấu trúc (nghĩa là ) của mã của bạn phản ánh chính xác phần cấu trúc của quy trình tạo dữ liệu. 0E[W]=(1/shape)!01 + x*beta
Các phân phối ExGaussian là tổng của một bình thường và một mũ. Có một chức năng ? RexGAUS trong gói gamlss.dist để tạo các hàm này. Tôi không có gói đó, nhưng bạn sẽ có thể điều chỉnh mã của tôi ở trên mà không gặp quá nhiều khó khăn. Bạn cũng có thể tạo một biến bình thường ngẫu nhiên (thông qua rnorm()
) và hàm mũ (qua rexp()
) và tổng hợp chúng khá dễ dàng. Chỉ cần nhớ trừ trung bình dân số, , từ mỗi lỗi trước khi thêm lỗi vào phần cấu trúc của quy trình tạo dữ liệu. (Tuy nhiên, hãy cẩn thận để không trừ trung bình mẫu !) μ+1/λmean(errors)
Một số ý kiến cuối cùng, không liên quan: Mã ví dụ của bạn trong câu hỏi có phần bị sai sót (có nghĩa là không vi phạm). Bởi vì rnorm(N)
tạo dữ liệu với mean=0
và sd=1
theo mặc định, 0.4*rnorm(N)
sẽ tạo ra rnorm(N, mean=0, sd=0.4)
. Mã của bạn (và có thể là suy nghĩ của bạn) sẽ rõ ràng hơn nhiều nếu bạn sử dụng công thức sau. Ngoài ra, mã của bạn beta
có vẻ bối rối. Chúng tôi thường nghĩ vềβtrong một mô hình kiểu hồi quy như một tham số, không phải là một biến ngẫu nhiên. Đó là, một hằng số chưa biết chi phối hành vi của quá trình tạo dữ liệu, nhưng bản chất ngẫu nhiên của quy trình được gói gọn bởi các lỗi. Đây không phải là cách chúng ta nghĩ về nó khi chúng ta làm việc với các mô hình đa cấp và mã của bạn dường như nằm giữa mô hình hồi quy tiêu chuẩn và mã cho mô hình hồi quy đa cấp. Chỉ định riêng betas của bạn là một ý tưởng tốt để duy trì sự rõ ràng về khái niệm của mã, nhưng đối với mô hình hồi quy tiêu chuẩn, bạn sẽ chỉ gán một số duy nhất cho mỗi beta (ví dụ beta0 <- 1; beta1 <- .04
:).