एक अलग त्रुटि विचरण के साथ डेटा का अनुकरण करने के लिए, आपको त्रुटि विचरण के लिए डेटा जनरेट करने की प्रक्रिया को निर्दिष्ट करने की आवश्यकता है। जैसा कि टिप्पणियों में बताया गया है, आपने वह किया जब आपने अपना मूल डेटा बनाया था। यदि आपके पास वास्तविक डेटा है और यह कोशिश करना चाहते हैं, तो आपको केवल उस फ़ंक्शन को पहचानने की आवश्यकता है जो निर्दिष्ट करता है कि अवशिष्ट विचरण आपके कोवरिएट्स पर कैसे निर्भर करता है। अपने मॉडल को फिट करने के लिए मानक तरीका यह जांचें कि यह उचित है (विषमलैंगिकता के अलावा), और अवशेषों को बचाएं। वे अवशिष्ट एक नए मॉडल के 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
की ? Plot.lm आप एक साजिश (सीएफ, दे देंगे यहाँ बच के शुद्ध मान का वर्गमूल, काम आते हुए एक lowess फिट, जो सिर्फ तुम क्या जरूरत है साथ आच्छादित की)। (यदि आपके पास कई सहसंयोजक हैं, तो आप इसका आकलन प्रत्येक कोवरिएट के खिलाफ अलग-अलग करना चाह सकते हैं।) एक वक्र का थोड़ा सा संकेत है, लेकिन यह एक सीधी रेखा की तरह दिखता है जो डेटा को फिटिंग करने का एक अच्छा काम करता है। तो चलिए उस मॉडल को स्पष्ट रूप से फिट करते हैं:
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
ध्यान दें कि यह प्रक्रिया किसी अन्य सांख्यिकीय विधि की तुलना में सही डेटा जनरेट करने की प्रक्रिया को खोजने के लिए अधिक गारंटी नहीं है। त्रुटि एसडी उत्पन्न करने के लिए आपने एक गैर-रैखिक फ़ंक्शन का उपयोग किया, और हमने इसे एक रैखिक फ़ंक्शन के साथ अनुमानित किया। यदि आप वास्तव में सही डेटा जनरेट करने की प्रक्रिया को प्राथमिकता देते हैं (जैसा कि इस मामले में, क्योंकि आपने मूल डेटा की नकल की है), तो आप इसका उपयोग भी कर सकते हैं। आप यह तय कर सकते हैं कि यहाँ सन्निकटन आपके उद्देश्यों के लिए पर्याप्त है या नहीं। हम आम तौर पर सही डेटा जनरेट करने की प्रक्रिया को नहीं जानते हैं, हालांकि, और ओक्टम के रेजर के आधार पर, सबसे सरल फ़ंक्शन के साथ जाते हैं जो हमारे द्वारा उपलब्ध जानकारी की मात्रा को दिए गए डेटा को पर्याप्त रूप से फिट करता है। यदि आप चाहें तो आप स्प्लिन या फैनसीयर दृष्टिकोण भी आजमा सकते हैं। द्विभाजित वितरण मेरे जैसे ही दिखते हैं,