2012-03-06 23 views
6

निम्नलिखित उदाहरण में, मान लें कि आपके पास एक मॉडल है जहां supp एक कारक चर है।आर सूत्र और परिणामी गुणांक नाम

lm(len ~ dose + supp, data = ToothGrowth) 

लेकिन मैं कारक के लिए अलग अलग आधार स्तर का उपयोग करना चाहते। मैं सूत्र में सीधे इस निर्दिष्ट कर सकते हैं:

lm(len ~ dose + relevel(supp, "VC"), data = ToothGrowth) 

और उत्पादन होगा:

Call: 
lm(formula = len ~ dose + relevel(supp, "VC"), data = ToothGrowth) 

Coefficients: 
     (Intercept)     dose relevel(supp, "VC")OJ 
      5.573     9.764     3.700 

यह सूत्र में सीधे परिवर्तनों ऐसा करने के लिए, और मध्यवर्ती डेटा सेट कर सकते हैं या बदल नहीं बहुत सुविधाजनक है मौजूदा एक एक उदाहरण यह है कि जब आप चर मॉडल को मानकीकृत करने के लिए scale का उपयोग करते हैं, जहां अंतिम मॉडल में शामिल अन्य चरों में मिसाइलों के लिए यह आवश्यक है। अक्सर, हालांकि उत्पादन में परिणामस्वरूप गुणांक नाम काफी बदसूरत हो जाते हैं।

मेरा प्रश्न है: क्या एक चर के नाम को निर्दिष्ट करना संभव है जो फ़ॉर्मूला के साथ काम करते समय अभिव्यक्ति से उत्पन्न होता है?

lm(len ~ dose + (OJ = relevel(supp, "VC")), data = Toothgrowth) 

(जो काम नहीं करता) की तरह कुछ।

संपादित करें: जबकि जी ग्रोथेंडिक द्वारा प्रस्तावित समाधान अच्छा है, यह वास्तव में गलत परिणाम उत्पन्न करता है। निम्न उदाहरण यह दिखाता है:

# Create some data: 
df <- data.frame(x1 = runif(10), x2=runif(10)) 
df <- transform(df, y = x1 + x2 + rnorm(10)) 

# Introduce some missings. 
df$x1[2:3] <- NA 

# The wrong result: 
lm(formula = y ~ z1 + z2, 
    data = transform(df, z1 = scale(x1), z2=scale(x2))) 

# extract a model frame. 
df2 <- model.frame(y ~ x1 + x2, df) 

# The right result: 
lm(formula = y ~ scale(x1) + scale(x2), 
    data = df2) 

# or: 
lm(formula = y ~ z1 + z2, 
    data = transform(model.frame(y ~ x1 + x2, df), 
      z1 = scale(x1), z2 = scale(x2))) 

मुद्दा यह है कि जब x2 नीचा दिखा है, यह द्वारा किए गए अवलोकन अंतिम मॉडल में क्योंकि x1 missings है नहीं कर रहे हैं का उपयोग करता है।

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

मुझे आशा है कि प्रश्न स्पष्ट है।

उत्तर

7

formula= बहस में के बजाय data= तर्क में यह संशोधित करें:

lm(len ~ dose + OJ, data = transform(ToothGrowth, OJ = relevel(supp, "VC"))) 
+0

अच्छा, बहुत बहुत शुक्रिया! – Stefan

+1

यदि आपको यह पसंद है और यह आपकी समस्या हल करता है, तो आपको इसे स्वीकार करने के लिए क्लिक करना चाहिए ... –

+0

हाय, जीजी, जबकि आपका जवाब अच्छा है और कई मामलों में काम करता है, यह अभी भी अवांछित परिणाम दे सकता है। मैंने प्रश्न के संपादन में एक उदाहरण बनाया। – Stefan

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