2013-02-19 55 views
9

क्या कोई एकल कार्य है, "रनिफ़", "रेनोर्म" जैसा है और जैसे रैखिक मॉडल के लिए नकली भविष्यवाणियां उत्पन्न होंगी? मैं इसे अपने आप कोड कर सकता हूं, लेकिन कोड बदसूरत है और मुझे लगता है कि यह ऐसा कुछ है जो किसी ने पहले किया है।क्या कोई फ़ंक्शन या पैकेज है जो एलएम() से लौटाई गई ऑब्जेक्ट के लिए भविष्यवाणियों का अनुकरण करेगा?

sims = rlm(1000, fit, newX) 

कि समारोह y मूल्यों के 1000 सिमुलेशन, नई एक्स चर के आधार पर वापसी होगी:

slope = 1.5 
intercept = 0 
x = as.numeric(1:10) 
e = rnorm(10, mean=0, sd = 1) 
y = slope * x + intercept + e 
fit = lm(y ~ x, data = df) 
newX = data.frame(x = as.numeric(11:15)) 

क्या मैं में दिलचस्पी रखता हूँ एक समारोह है कि नीचे लाइन की तरह लग रहा है।

+1

अंतिम पंक्ति अपने क्यू में मुझे उलझन में है। 'x' तय है; क्या आप नए 'x' डेटा के लिए' y' (प्रतिक्रिया) अनुकरण करते हैं? –

+0

क्षमा करें, गेविन, आप सही हैं। मेरा कहना था कि प्रतिक्रियाओं को अनुकरण किया जाएगा। इसे संपादित किया गया है। – PirateGrunt

+2

ठीक है, तो आप 'अनुकरण' पर देख सकते हैं लेकिन यह केवल वर्तमान 'x' के लिए काम करता है। लेकिन आप मौजूदा ऑब्जेक्ट की बजाय 'newdata = newX' के साथ 'ऑब्जेक्ट()' के साथ मॉडल ऑब्जेक्ट पर' predict() 'को कॉल करने के लिए (simulate.lm()') को बदल सकते हैं और फिर इसे आगे बढ़ने की अनुमति दें सामान्य कोड मानते हैं कि 'भार' का उपयोग नहीं किया गया था क्योंकि इससे मामलों को जटिल बनाया जाएगा ... –

उत्तर

8

दिखा रहा है कि stats:::simulate.lm संशोधित करने के लिए गेविन सिम्पसन का सुझाव एक व्यवहार्य है।

## Modify stats:::simulate.lm by inserting some tracing code immediately 
## following the line that reads "ftd <- fitted(object)" 
trace(what = stats:::simulate.lm, 
     tracer = quote(ftd <- list(...)[["XX"]]), 
     at = list(5)) 

## Prepare the data and 'fit' object 
df <- data.frame(x=x<-1:10, y=1.5*x + rnorm(length(x))) 
fit <- lm(y ~ x, data = df) 
newX <- 8:1 

## Pass in new x-values via the argument 'XX' 
simulate(fit, nsim = 4, XX = newX) 
#  sim_1 sim_2  sim_3 sim_4 
# 1 8.047710 8.647585 7.9798728 8.400672 
# 2 6.398029 7.714972 7.9713929 7.813381 
# 3 5.469346 5.626544 4.8691962 5.282176 
# 4 4.689371 4.310656 4.2029540 5.257732 
# 5 4.628518 4.467887 3.6893648 4.018744 
# 6 2.724857 4.280262 2.8902676 4.347371 
# 7 1.532617 2.400321 2.4991168 3.357327 
# 8 1.300993 1.379705 0.1740421 1.549881 

काम करता है यही कारण है, लेकिन यह एक क्लीनर है (और उनसे बेहतर) दृष्टिकोण:

## A function for simulating at new x-values 
simulateX <- function(object, nsim=1, seed=NULL, X, ...) { 
    object$fitted.values <- X 
    simulate(object=object, nsim=nsim, seed=seed, ...) 
} 

## Prepare a fit object and some new x-values 
df <- data.frame(x=x<-1:10, y=1.5*x + rnorm(length(x))) 
fit <- lm(y ~ x, data = df)  
newX <- 8:1 

## Try it out 
simulateX(fit, nsim = 4, X = newX) 
#  sim_1 sim_2  sim_3  sim_4 
# 1 8.828988 6.890874 7.397280 8.1605794 
# 2 6.162839 8.174032 3.612395 7.7999466 
# 3 5.861858 6.351116 3.448205 4.3721326 
# 4 5.298132 4.448778 2.006416 5.7637724 
# 5 7.260219 4.015543 3.063622 4.2845775 
# 6 3.107047 4.859839 6.202650 -1.0956775 
# 7 1.501132 1.086691 -1.273628 0.4926548 
# 8 1.197866 1.573567 2.137449 0.9694006 
+0

यह शानदार है। दूसरा समाधान अच्छा और साफ है। पहला ऐसा कुछ डिबगिंग तकनीकों का उपयोग करता है जो मैंने अभी तक नहीं सीखा है। अति उत्कृष्ट। धन्यवाद। – PirateGrunt

+0

@PirateGrunt - खुशी है कि आपने 'ट्रेस() 'उदाहरण की सराहना की - यह आर विकास और कोड अन्वेषण के लिए एक वास्तविक powertool है। यदि आप इसका अधिक उपयोग करेंगे, तो आप [इस quesion के उत्तरों] की सराहना कर सकते हैं (http://stackoverflow.com/questions/11319161/what-is-a-fast-way-to-set-debugging-code-at -a-given-line-in-a-function), जो वांछित कोड सम्मिलन बिंदु से संबंधित 'at =' के मान को ढूंढना अधिक आसान बनाता है। (मैं अक्सर माइकल हॉफमैन के उत्तर से 'print.func() 'का उपयोग करता हूं। इसे' print.func (आँकड़े ::: simulate.lm)' के साथ आज़माएं। का आनंद लें! –