2012-12-03 7 views
9

मैंने बैचों में संभावना अनुपात परीक्षण करने के लिए एक रैपर फ़ंक्शन लिखने की कोशिश की। मैंने प्रारंभिक मॉडल को अद्यतन करने के लिए अद्यतन() को शामिल करने का प्रयास किया। हालांकि, ऐसा लगता है कि फ़ंक्शन के अंदर वस्तुओं की तलाश करने के बजाय, यह वैश्विक वातावरण में वस्तुओं की खोज करता है।अद्यतन() फ़ंक्शन के अंदर केवल वैश्विक वातावरण की खोज करता है?

fake <- data.frame(subj= rep(1:5, 4), 
        factor1 = rep(LETTERS[c(1,2,1,2)], each=5), 
        factor2 = rep(letters[1:2], each=10), 
        data=sort(rlnorm(20))) 

foo <- function(){ 
        temp <- fake 
        model1 <- lmer(data~factor1*factor2 + (1 |subj), temp) 
        model1a <- update(model1, ~.-factor1:factor2) 
        model1a} 

और यह नीचे एक त्रुटि संदेश देता है:

Error in eval(expr, envir, enclos) : object 'factor1' not found 

वहाँ अद्यतन() फ़ंक्शन के भीतर खोज करने के लिए वैसे भी है? धन्यवाद!

संपादित करें:

मैंने गलती की। मैं "नकली" नहीं चाहता था, न कि "नकली"।

EDIT2: एक सुविधाजनक समाधान सुझाव दिया गया है कि बस डेटा ऑब्जेक्ट निर्दिष्ट करें।

Error in anova(model1, model1b) : 
    all models must be fit to the same data object 
: हालांकि अद्यतन() अब इस के साथ कोई समस्या नहीं है, एनोवा() को लगता है कि मॉडल मैं तुलना करने के लिए कोशिश कर रहा हूँ विभिन्न आंकड़ों पर आधारित हैं वस्तुओं

foo <- function(){ 
        temp <- fake 
        model1 <- lmer(data~factor1*factor2 + (1 |subj), data=temp) 
        model1a <- update(model1, ~.-factor1:factor2, data=temp) 
        anova(model1, model1a) 
      } 
foo() 

मैं एक त्रुटि संदेश मिलता रहा है

मुझे लगता है कि यह त्रुटि अद्यतन() से परे है। लेकिन मुझे आश्चर्य है कि अगर कोई जानता है कि इसे कैसे हल किया जा सकता है। ध्यान दें कि यदि मैं अद्यतन() का उपयोग कर और बजाय मॉडल (नीचे देखें) उल्लेख के बिना समारोह लिखते हैं, त्रुटि ऊपर चला जाता है:

foo <- function(){ 
        temp <- fake 
        model1 <- lmer(data~factor1*factor2 + (1 |subj), data=temp) 
        model1a <- lmer(data~factor1 + factor2 + (1 |subj), data=temp) 
        anova(model1, model1a) 
      } 
foo() 

Data: temp 
Models: 
model1a: data ~ factor1 + factor2 + (1 | subj) 
model1: data ~ factor1 * factor2 + (1 | subj) 
     Df  AIC BIC logLik Chisq Chi Df Pr(>Chisq) 
model1a 5 -4.6909 3.7535 7.3454       
model1 6 -8.8005 1.3327 10.4003 6.1097  1 0.01344 * 
--- 
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

संपादित करें 3: ऐसा लगता है कि इस मुद्दे को एनोवा के साथ है() । मैं भी जिन्हें आप नीचे देख @hadley

foo2 <- function(){ 
    my_update <- function(mod, formula = NULL, data = NULL) { 
    call <- getCall(mod) 
    if (is.null(call)) { 
    stop("Model object does not support updating (no call)", call. = FALSE) 
    } 
    term <- terms(mod) 
    if (is.null(term)) { 
    stop("Model object does not support updating (no terms)", call. = FALSE) 
    } 
    if (!is.null(data)) call$data <- data 
    if (!is.null(formula)) call$formula <- update.formula(call$formula, formula) 
    env <- attr(term, ".Environment") 
    eval(call, env, parent.frame())} 

     model1 <- lmer(data~factor1*factor2 + (1 |subj), temp) 
     model1a <- my_update(model1, ~.-factor1:factor2) 
     anova(model1, model1a) 
} 
foo2() 

मैं एक त्रुटि संदेश मिला द्वारा सुझाव की कोशिश की:

Error in as.data.frame.default(data) : 
    cannot coerce class 'structure("mer", package = "lme4")' into a data.frame 
+0

आर 2.15 में कोई त्रुटि नहीं के साथ मेरे लिए काम करता है।1, lme4 पैकेज लोड करने की आवश्यकता से अलग – MattBagg

+0

क्या आप 'नकली' के बजाय 'temp'' lmer' को पास करना चाहते थे? – BenBarnes

+0

क्षमा करें, हां, मैं अस्थायी – Alex

उत्तर

8

मैंने पहले भी इस व्यवहार ने काट लिया गया है, तो मैं update के अपने खुद के संस्करण में लिखा था । यह सूत्र के पर्यावरण में सबकुछ का मूल्यांकन करता है, इसलिए यह काफी मजबूत होना चाहिए।

my_update <- function(mod, formula = NULL, data = NULL) { 
    call <- getCall(mod) 
    if (is.null(call)) { 
    stop("Model object does not support updating (no call)", call. = FALSE) 
    } 
    term <- terms(mod) 
    if (is.null(term)) { 
    stop("Model object does not support updating (no terms)", call. = FALSE) 
    } 

    if (!is.null(data)) call$data <- data 
    if (!is.null(formula)) call$formula <- update.formula(call$formula, formula) 
    env <- attr(term, ".Environment") 

    eval(call, env, parent.frame()) 
} 

library(nlme4) 

fake <- data.frame(
    subj = rep(1:5, 4), 
    factor1 = rep(LETTERS[c(1,2,1,2)], each = 5), 
    factor2 = rep(letters[1:2], each = 10), 
    data = sort(rlnorm(20))) 

foo <- function() { 
    temp <- fake 
    model1 <- lmer(data ~ factor1 * factor2 + (1 | subj), fake) 
    model1a <- my_update(model1, ~ . - factor1:factor2) 
    model1a 
} 
foo() 
+0

ऐसा लगता है कि अब समस्या एनोवा() के साथ है। मैंने आपकी विधि की कोशिश की, जो मॉडल अद्यतन के साथ पूरी तरह से ठीक काम करता है। हालांकि, जब मैंने anova() का उपयोग करने का प्रयास किया, तो उसने मुझे एक मूल संदेश दिया जैसा कि मेरी मूल पोस्ट के EDIT 3 में दिखाया गया है। आपके सहयोग के लिए धन्यवाद! – Alex

+0

@AlexH।, हैडली का जवाब यहां जाने का तरीका है। यह फॉर्मूला और डेटा घटकों को इस तरह से गुजरता है जो 'एनोवा' के साथ काम करेगा। उपर्युक्त 'foo2' फ़ंक्शन में, आपने ऑब्जेक्ट' temp' बनाने के लिए उपेक्षित किया, जिसे, जब जोड़ा गया, मेरे लिए काम किया। – BenBarnes

4

हालांकि मैं वास्तव में की तरह @ हैडली का जवाब (और संभावित उपयोग कि अपने आप में कार्य करेंगे), आप भी update समारोह में एक data तर्क निर्दिष्ट कर सकते हैं। (यहाँ, मैं आप अपने मॉडल के लिए temp पारित करने के लिए चाहता था ग्रहण किया।)

model1a <- update(model1, ~.-factor1:factor2, data = temp) 

संपादित

आप anova साथ मॉडल की तुलना करने के लिए देख रहे हैं, तो update के नाम ऊपर mung होगा data तर्क और "चाल" anova यह मानने के लिए कि दो मॉडल दो अलग-अलग डेटासेट का उपयोग कर फिट थे। केवल सूत्र को अपडेट करना और नया मॉडल बनाना इस से बच जाएगा:

foo <- function(){ 
        temp <- fake 
        model1 <- lmer(data~factor1*factor2 + (1 |subj), data=temp) 
        newForm <- update.formula(formula(model1), ~.-factor1:factor2) 
        model1a <- lmer(newForm, data=temp) 
        anova(model1, model1a) 
      } 
+0

लेकिन ... मुझे लगता है कि यह वास्तव में * स्थिर 'lme4' के साथ काम नहीं करता है (मैं सहमत हूं कि यह चाहिए) ...? –

+0

@ बेनबॉल्कर, दिलचस्प मुद्दा। पोस्ट करने से पहले, मैंने ओएसएक्स पर आर 2.15.2 का उपयोग करके उत्तर का सफलतापूर्वक परीक्षण किया (मुझे यकीन है कि) 'lme4' के नियमित क्रैन मैक बाइनरी संस्करण)। यह 'lme4_0.999999-0' और 'Matrix_1.0-9' का उपयोग कर WinXP पर आर 2.15.2 के साथ भी काम करता है। – BenBarnes

+0

क्षमा करें, मैंने गलत समझा कि आप क्या कर रहे थे। –

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