จำลองการถดถอยเชิงเส้นด้วย heteroscedasticity


9

ฉันพยายามจำลองชุดข้อมูลที่ตรงกับข้อมูลเชิงประจักษ์ที่ฉันมี แต่ไม่แน่ใจว่าจะประเมินข้อผิดพลาดในข้อมูลต้นฉบับได้อย่างไร ข้อมูลเชิงประจักษ์รวมถึง heteroscedasticity แต่ฉันไม่สนใจที่จะเปลี่ยนมันออกไป แต่ใช้โมเดลเชิงเส้นที่มีคำผิดพลาดเพื่อจำลองแบบจำลองของข้อมูลเชิงประจักษ์

ตัวอย่างเช่นสมมติว่าฉันมีชุดข้อมูลเชิงประจักษ์และโมเดล:

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)

ใช้plot(n,y)เราได้รับดังต่อไปนี้ ป้อนคำอธิบายรูปภาพที่นี่

อย่างไรก็ตามถ้าฉันพยายามจำลองข้อมูล, simulate(mod)heteroscedasticity จะถูกลบออกและไม่ถูกจับโดยแบบจำลอง

ฉันสามารถใช้โมเดลกำลังสองน้อยที่สุด

VMat <- varFixed(~n)
mod2 = gls(y ~ n, weights = VMat)

ที่ให้แบบจำลองที่ดีขึ้นตาม AIC แต่ฉันไม่รู้วิธีจำลองข้อมูลโดยใช้เอาต์พุต

คำถามของฉันคือฉันจะสร้างแบบจำลองที่จะช่วยให้ฉันสามารถจำลองข้อมูลให้ตรงกับข้อมูลเชิงประจักษ์ (n และ y ด้านบน) ได้อย่างไร โดยเฉพาะฉันต้องการวิธีประมาณ sigma2 ข้อผิดพลาดโดยใช้ทั้งสองแบบ?


1
ดังนั้นโมเดลเชิงเส้นจะไม่สามารถจับภาพ heteroskedasticity แบบมีเงื่อนไขได้เว้นแต่จะพยายามทำอย่างชัดเจนโดยใช้หนึ่งในสองสามวิธี เทคนิคเศรษฐมิติแบบมาตรฐานจะปรับข้อผิดพลาดมาตรฐานของพารามิเตอร์เพื่ออธิบายความแตกต่างแบบ heteroskedasticity แต่พวกเขาไม่ได้ทำแบบจำลองอย่างชัดเจน
generic_user

คุณถูก. ฉันกำลังพยายามใช้โมเดลเชิงเส้นเพื่อจับภาพความแตกต่าง ฉันคิดว่าฉันควรใช้โมเดลกำลังสองน้อยที่สุด หากมีคำแนะนำอื่น ๆ ฉันจะลองทำดู
user44796

มีข้อผิดพลาดในรหัสของคุณคุณต้องใช้ `lm (y ~ n)`
kjetil b halvorsen

1
ฉันไม่เข้าใจคำถามของคุณเพราะรหัสของคุณบรรลุสิ่งที่คุณดูเหมือนจะขอในชื่อของมัน: มันจำลองการถดถอยเชิงเส้นที่มีข้อผิดพลาด heteroscedastic คุณกำลังขอวิธีในการประเมินแบบจำลองชนิดต่าง ๆ สำหรับความแตกต่างแบบเฮเทอโรเซติกหรือไม่? ถ้าเป็นเช่นนั้นคุณจะต้องระบุรูปแบบ!
whuber

หวังว่าฉันจะได้ชี้แจงคำถามของฉันกับการแก้ไข ในคำถามข้างต้น n และ y แสดงถึงข้อมูลเชิงประจักษ์ ฉันต้องการจัดวางโมเดลให้สอดคล้องกับข้อมูลจากนั้นใช้โมเดลเพื่อสร้างข้อมูลจำลองที่ตรงกับค่าเฉลี่ยและส่วนที่เหลือของข้อมูลต้นฉบับ
user44796

คำตอบ:


9

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

ป้อนคำอธิบายรูปภาพที่นี่


นี่เป็นข้อสรุปจริง ๆ ที่ฉันเริ่มมา แต่จะไม่มีทางมาถึงคำตอบที่งดงาม
user44796

5

คุณต้องสร้างแบบจำลอง heteroskedasticity วิธีการหนึ่งคือผ่านแพคเกจ R (CRAN) dglmการกระจายตัวแบบเชิงเส้นทั่วไป นี่คือส่วนขยายของ glm ซึ่งนอกเหนือจากปกติglmแล้วจะเหมาะกับ glm ที่สองสำหรับการกระจายตัวจากส่วนที่เหลือจาก glm แรก ฉันไม่มีประสบการณ์กับโมเดลดังกล่าว แต่พวกเขาดูดี ... นี่คือโค้ดบางส่วน:

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)

library(dglm)  ### double glm's

mod2   <-  dglm(y ~ n, ~ n, gaussian,ykeep=TRUE,xkeep=TRUE,zkeep=TRUE)
### This uses log link for the dispersion part, should also try identity link ..

y2 <-  simulate(mod2)

plot(n, y2$sim_1)

mod3  <-  dglm(y ~ n, ~ n, gaussian, dlink="identity", ykeep=TRUE,xkeep=TRUE,zkeep=TRUE)  ### This do not work because it leads to negative weights!

พล็อตจำลองแสดงอยู่ด้านล่าง:

ป้อนคำอธิบายรูปภาพที่นี่

พล็อตดูเหมือนว่าการจำลองนั้นใช้ความแปรปรวนโดยประมาณ แต่ฉันไม่แน่ใจเนื่องจากฟังก์ชัน simulate () ไม่มีวิธีการสำหรับ dglm ...

(ความเป็นไปได้อีกประการคือการใช้Rแพ็คเกจgamlssซึ่งใช้วิธีการอื่นในการสร้างแบบจำลองความแปรปรวนเป็นฟังก์ชันของ covariables)


1
โมเดลเชิงเส้นคู่แบบทั่วไปปรากฏขึ้นเพื่อสร้างแบบจำลองข้อมูลดั้งเดิมอย่างเพียงพอ ฉันไม่ชัดเจนเกี่ยวกับวิธีการจำลองข้อผิดพลาดที่เหลือโดยใช้การทำนาย () ฉันจะต้องดูว่า
user44796
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.