2012-08-02 24 views
8

में भविष्यवाणी का उपयोग कर रहा पैकेज NLME निम्नलिखित कोड का उपयोग कर के साथ एक समस्या है:NLME वस्तुओं के साथ एक समारोह कॉल और एक सूत्र

library(nlme) 
x <- rnorm(100) 
z <- rep(c("a","b"),each=50) 
y <- rnorm(100) 
test.data <- data.frame(x,y,z) 
test.fun <- function(test.dat) 
{ 
    form <- as.formula("y~x") 
    ran.form <- as.formula("~1|z") 
    modell <- lme(fixed = form, random=ran.form, data=test.dat) 
    pseudo.newdata <- test.dat[1,] 
    predict(modell, newdata= pseudo.newdata) ###THIS CAUSES THE ERROR! 
} 

test.fun(test.data) 

कारणों की भविष्यवाणी एक त्रुटि और मैं पहले से ही पाया क्या मूल रूप से यह कारण बनता है।

मॉडेल ऑब्जेक्ट सहेजता है कि इसे कैसे कहा जाता है और भविष्यवाणी भविष्यवाणी करने के लिए प्रतीत होती है लेकिन फार्मूला ऑब्जेक्ट्स फॉर्म और रन.फॉर्म को खोजने में असमर्थ है क्योंकि यह सही नामस्थान में उनकी तलाश नहीं करता है। वास्तव में, मैं ऐसा करने से समस्या से बचने कर सकते हैं: हालांकि

attach(environment(form), warn.conflicts = FALSE) 
predict(modell, newdata= pseudo.newdata) 
detach() 

मेरे दीर्घकालिक लक्ष्य डिस्क के लिए मॉडल को बचाने और उन्हें बाद में उपयोग करने के लिए है। मुझे लगता है कि मैं फॉर्मूला ऑब्जेक्ट्स को भी सहेजने की कोशिश कर सकता हूं, लेकिन यह समस्या से निपटने के लिए मुझे बहुत परेशान और बोझिल तरीके से मारता है।

मैं उन्हें स्पष्ट रूप से लिखने के बजाय स्वचालित रूप से जेनरेट किए गए फॉर्मूला ऑब्जेक्ट्स के साथ काम करता हूं क्योंकि मैं बैच प्रक्रिया में विभिन्न परिभाषाओं के साथ कई मॉडल बनाते हैं, इसलिए मैं उनसे नहीं बच सकता। तो मेरा आदर्श समाधान एलएमई ऑब्जेक्ट बनाने का एक तरीका होगा ताकि मैं फॉर्मूला ऑब्जेक्ट को बाद में भूल सकूं और "बस काम करता है" की भविष्यवाणी कर सकूं। किसी भी मदद के लिए धन्यवाद।

उत्तर

5

do.call(lme, list(arg1, arg2, arg3)) के साथ बदलने का प्रयास करें।

library(nlme) 
x <- rnorm(100) 
z <- rep(c("a","b"),each=50) 
y <- rnorm(100) 
test.data <- data.frame(x,y,z) 
test.fun <- function(test.dat) 
{ 
    form <- as.formula("y~x") 
    ran.form <- as.formula("~1|z") 
    ## JUST NEED TO CHANGE THE FOLLOWING LINE 
    ## modell <- lme(fixed = form, random=ran.form, data=test.dat) 
    modell <- do.call(lme, list(fixed=form, random=ran.form, data=test.data)) 
    pseudo.newdata <- test.dat[1,] 
    predict(modell, newdata= pseudo.newdata) ###THIS CAUSES THE ERROR! 
} 

test.fun(test.data) 
#   a 
# 0.07547742 
# attr(,"label") 
# [1] "Predicted values" 

यह काम करता है क्योंकि do.call() बुला फ्रेम में अपने तर्क सूची का मूल्यांकन करता है, से पहलेlme() है कि यह निर्माण करने के लिए कॉल का मूल्यांकन। यह देखने के लिए कि मदद करता है, debug(predict) टाइप करें, और फिर ब्राउज़र में पॉप-अप होने पर मुद्रित डिबगिंग संदेशों की तुलना करके अपना कोड और मेरा चलाएं।

+1

+1 'do.call' – Andrie

+0

का अच्छा उपयोग ब्रायन रिपली ने मुझे 2003 में eval का उपयोग करके एक समान चाल सिखाई। चूंकि मैं इसे अक्सर इस्तेमाल कर रहा हूं, हमने इसे "रिपली गेम" नाम दिया है। http://finzi.psych.upenn.edu/R/Rhelp02a/archive/16599.html –

+1

+1 यह मेरे साथ हैक करना शुरू करने से काफी बेहतर है, जो 'मॉडेल <- lapply (modell $ call' जैसा था , eval.parent) '(यूघ)। यह बहुत बुरा है कि यह सामान जरूरी है, यद्यपि ... मॉडलिंग ढांचे के कुछ डिजाइन (अनावश्यक रूप से ??) नाजुक है ... –

संबंधित मुद्दे