ในการจำลองข้อมูลที่มีความแปรปรวนข้อผิดพลาดที่แตกต่างกันคุณต้องระบุกระบวนการสร้างข้อมูลสำหรับความแปรปรวนข้อผิดพลาด ดังที่ได้อธิบายไว้ในความคิดเห็นที่คุณทำเมื่อคุณสร้างข้อมูลต้นฉบับของคุณ หากคุณมีข้อมูลจริงและต้องการลองใช้งานคุณเพียงแค่ต้องระบุฟังก์ชันที่ระบุว่าความแปรปรวนที่เหลือนั้นขึ้นอยู่กับค่าความแปรปรวนร่วมของคุณ วิธีมาตรฐานในการทำเช่นนั้นคือให้พอดีกับแบบจำลองของคุณตรวจสอบว่ามีเหตุผล (นอกเหนือจากความแตกต่างแบบเฮเทอโรพลาสติก) และบันทึกสิ่งตกค้าง เศษซากเหล่านั้นกลายเป็นตัวแปร Y ของโมเดลใหม่ ด้านล่างฉันได้ทำเช่นนั้นสำหรับกระบวนการสร้างข้อมูลของคุณ (ฉันไม่เห็นตำแหน่งที่คุณตั้งค่าเมล็ดสุ่มดังนั้นสิ่งเหล่านี้จะไม่เป็นข้อมูลเดียวกัน แต่ควรจะคล้ายกันและคุณสามารถทำซ้ำเหมืองได้อย่างแน่นอนโดยใช้เมล็ดพันธุ์ของฉัน)
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)
โปรดทราบว่าR
's ? plot.lmจะให้พล็อต (เทียบกับที่นี่ ) ของสแควร์รูทของค่าสัมบูรณ์ของค่าตกค้างที่ซ้อนทับอย่างเป็นประโยชน์ด้วยค่าความพอดีต่ำซึ่งเป็นสิ่งที่คุณต้องการ (ถ้าคุณมีโควาเรียหลายตัวคุณอาจต้องการประเมินค่านี้กับค่าความแปรปรวนร่วมแต่ละค่า) มีเส้นโค้งเล็กน้อยที่สุด แต่ดูเหมือนว่าเส้นตรงจะทำงานได้ดีในการปรับข้อมูลให้เหมาะสม ดังนั้นขอให้พอดีกับโมเดลนั้น:
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)
เราไม่จำเป็นต้องกังวลว่าความแปรปรวนที่เหลือดูเหมือนจะเพิ่มขึ้นในพล็อตที่ตั้งขนาดสำหรับรุ่นนี้เช่นกัน - ที่ต้องเกิดขึ้นเป็นหลัก มีคำใบ้อีกเล็กน้อยของเส้นโค้งดังนั้นเราจึงสามารถลองใส่คำที่ยกกำลังสองและดูว่าช่วยได้หรือไม่ (แต่ไม่ได้):
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
หากเราพอใจกับสิ่งนี้เราสามารถใช้กระบวนการนี้เป็นส่วนเสริมเพื่อจำลองข้อมูล
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
โปรดทราบว่ากระบวนการนี้ไม่รับประกันว่าจะพบกระบวนการสร้างข้อมูลจริงมากกว่าวิธีทางสถิติอื่น ๆ คุณใช้ฟังก์ชันที่ไม่ใช่เชิงเส้นเพื่อสร้าง SD ข้อผิดพลาดและเราประมาณด้วยฟังก์ชันเชิงเส้น หากคุณรู้จักกระบวนการสร้างข้อมูลจริง a-Priori (ดังเช่นในกรณีนี้เนื่องจากคุณจำลองข้อมูลดั้งเดิม) คุณก็อาจใช้มันได้เช่นกัน คุณสามารถตัดสินใจได้ว่าการประมาณที่นี่ดีพอสำหรับวัตถุประสงค์ของคุณหรือไม่ โดยทั่วไปเราไม่ทราบว่ากระบวนการสร้างข้อมูลที่แท้จริงอย่างไรและตามมีดโกนของอ็อกคัมไปด้วยฟังก์ชั่นที่ง่ายที่สุดที่เหมาะสมกับข้อมูลที่เราได้รับปริมาณข้อมูลที่มีอยู่อย่างเพียงพอ นอกจากนี้คุณยังสามารถลองใช้ splines หรือวิธีที่นักเล่นชื่นชอบได้ตามต้องการ การแจกแจงแบบไบวาเรียดูสมเหตุสมผลกับฉัน