2013-02-19 14 views
9

Doğrusal bir model için simüle edilmiş tahminler üretecek "runif", "rnorm" ve benzerlerine benzer tek bir işlev var mı? Kodumu kendim yapabilirim, ama kod çirkindir ve bunun birisinin daha önce yapmış olduğu bir şey olduğunu varsayalım. Bu işlev yeni x değişkenlere dayalı y değerleri 1000 simülasyonları, dönecektilm() ile döndürülen bir nesne için tahminleri simüle edecek bir işlev veya paket var mı?

sims = rlm(1000, fit, newX) 

:

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)) 

Ne ilgilendiğim aşağıda hattı gibi görünen bir fonksiyondur.

+1

son satır beni karıştı sahiptir. 'x' sabittir; Yeni 'x' verileri için' y' (yanıtı) simüle etmek mi demek istiyorsun? –

+0

Üzgünüz, Gavin, haklısın. Yanıtların simüle edileceğini söylemeliyim. Bu düzenlenmiştir. – PirateGrunt

+2

Tamam, Yani 'simulate' 'e bakabilirdiniz, ancak bu sadece x' akımı için çalışır. Fakat ('simulate.lm()') 'i,' newdata = newX' ile güncelleştirilmiş çağrı yerine '' newdata = newX' ile model nesnesinde 'predict()' 'i çağırmak için ('simulate.lm()') değiştirebilir ve ardından normal kod. "Ağırlıklar" varsayımı, bu durumun karmaşık hale geleceği için kullanılmadı ... –

cevap

8

Gavin Simpson'un stats:::simulate.lm'u değiştirmeye yönelik önerisi uygun olanıdır. çalışır, ancak bu (muhtemelen daha iyi ve) bir temizleyici

## 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 

yaklaşım: En Q

## 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

Bu harika. İkinci çözüm güzel ve temiz. İlki daha öğrenmediğim bazı hata ayıklama tekniklerini kullanıyor. Mükemmel. Teşekkür ederim. – PirateGrunt

+0

@PirateGrunt - 'trace()' örneğini beğenmene sevindim - R geliştirme ve kod araştırması için gerçek bir powertool. Eğer çok kullanırsanız, [bu soruya verilen cevaplar] için minnettar olabilirsiniz (http://stackoverflow.com/questions/11319161/what-is-a-fast-way-to-set-debugging-code-at istenen kod ekleme noktasına karşılık gelen 'at =' değerini bulmayı çok daha kolay hale getiren -a-verilen-satır-içinde-işlevi). (Sık sık Michael Hoffman'ın yanıtından print.func() işlevini kullanırım. Örneğin, print.func (stats ::: simulate.lm) 'ile) deneyin. Keyfini çıkarın! –

İlgili konular