के भीतर उपयोग के लिए एक इंफिक्स ऑपरेटर को परिभाषित करना मैं this समाधान का एक अधिक पारदर्शी संस्करण बनाने की कोशिश कर रहा हूं, जिसमें d1 + d1:d2
रूप में सूत्र के आरएचएस को निर्दिष्ट करना शामिल है।एक सूत्र
यह देखते हुए कि एक सूत्र के संदर्भ में *
एक सारगर्भित स्टैंड में पूर्ण बातचीत के लिए है (यानी d1 * d2
d1 + d2 + d1:d2
देता है), मेरे दृष्टिकोण कोशिश करते हैं और एक वैकल्पिक ऑपरेटर परिभाषित करने के लिए किया गया है, इन्फ़िक्स दृष्टिकोण मैंने का उपयोग कर %+:%
कहना अन्य अनुप्रयोगों में के आदी हो गए, एक ला:
"%+:%" <- function(d1,d2) d1 + d2 + d1:d2
बहरहाल, यह जाहिर विफल रहता है, क्योंकि मैं नहीं किया है मूल्यांकन के बारे में सावधान कर दिया गया; मेरा प्रगति को वर्णन करने के लिए एक उदाहरण परिचय करते हैं:
set.seed(1029)
v1 <- runif(1000)
v2 <- runif(1000)
y <- .8*(v1 < .3) + .2 * (v2 > .25 & v2 < .8) -
.4 * (v2 > .8) + .1 * (v1 > .3 & v2 > .8)
इस उदाहरण के साथ, उम्मीद है कि यह स्पष्ट है क्यों बस दो शब्दों लिखने अवांछनीय हो सकता है:
y ~ cut(v2, breaks = c(0, .25, .8, 1)) +
cut(v2, breaks = c(0, .25, .8, 1)):I(v1 < .3)
एक वैकल्पिक हल जो मेरे वांछित आउटपुट के करीब है एक समारोह के रूप में पूरे सूत्र परिभाषित करने के लिए है:
plus.times <- function(outvar, d1, d2){
as.formula(paste0(quote(outvar), "~", quote(d1),
"+", quote(d1), ":", quote(d2)))
}
यह जब lm
के लिए पारित कर देता है उम्मीद गुणांक, लेकिन नाम के साथ कि एक कठिन फिर से सीधे व्याख्या करने के लिए (विशेष रूप से वास्तविक डेटा जहां हम देखभाल d1
और d2
वर्णनात्मक नाम इस सामान्य उदाहरण के विपरीत, देने के लिए):
out1 <- lm(y ~ cut(v2, breaks = c(0, .25, .8, 1)) +
cut(v2, breaks = c(0, .25, .8, 1)):I(v1 < .3))
out2 <- lm(plus.times(y, cut(v2, breaks = c(0, .25, .8, 1)), I(v1 < .3)))
any(out1$coefficients != out2$coefficients)
# [1] FALSE
names(out2$coefficients)
# [1] "(Intercept)" "d1(0.25,0.8]" "d1(0.8,1]" "d1(0,0.25]:d2TRUE"
# [5] "d1(0.25,0.8]:d2TRUE" "d1(0.8,1]:d2TRUE"
तो यह इष्टतम से कम है।
वहाँ इतना है कि इन्फ़िक्स ऑपरेटर मैं उपर्युक्त अपेक्षा के अनुरूप काम करता है कोड को समायोजित परिभाषित करने के लिए कोई तरीका है? कैसे plus.times
के रूप बदलकर देखें कि चर का नाम बदला नहीं कर रहे हैं के बारे में?
मैं चारों ओर (?formula
, ?"~"
, ?":"
, getAnywhere(formula.default)
, this जवाब, आदि) poking किया गया है, लेकिन नहीं देखा है कि कैसे वास्तव में आर व्याख्या *
जब यह एक सूत्र में सामना करना पड़ा है ताकि मैं अपने वांछित मामूली समायोजन कर सकते हैं ।
वे आँकड़े से व्याख्या कर रहे हैं ::: ग में model.frame.default https://github.com/wch/r-source/blob/ed66b715221d2720f5b334470335635bada520b1/src/library/stats/src/model.c#L888 – rawr
@rawr धन्यवाद। यह नहीं कह सकता कि मुझे पता है कि सी कोड में क्या हो रहा है - मुझे लगता है कि वे 'फॉर्मूला' द्वारा समझा जाने वाले प्रत्येक प्रतीक को "परिभाषित" करते हैं लेकिन वे केवल 'tildeSymbol' का उपयोग करते हैं। क्या इसका मतलब यह है कि मैं सी और परिभाषित करने के बिना अपने स्वयं के इंफिक्स प्राप्त नहीं कर पाऊंगा, कहें कि 'प्लसकोलन सिंबल' जैसा यहां किया गया है? – MichaelChirico
@ हीदर टर्नर का जवाब मेरे लिए बिल्कुल सही लगता है। यदि आप वास्तव में विस्तारित सूत्रों के साथ गड़बड़ करना शुरू करना चाहते हैं, तो मैं सुझाव दूंगा कि (1) 'model.frame()' के परिणामों के 'नियम' घटक को देखकर और (2) कोड को देखकर [यहां] (https) : //github.com/glmmTMB/glmmTMB/blob/master/glmmTMB/R/utils.R) ... –