[R] आर में एक मॉडल मैट्रिक्स में एक फैक्टर के सभी स्तर


Answers

(खुद को रिडीम करने की कोशिश कर रहा है ...) @ फिबियन पर जेरेड की टिप्पणी के जवाब में इसे स्वचालित करने के बारे में उत्तर दें, ध्यान दें कि आपको सभी की आपूर्ति करने की ज़रूरत है इसके विपरीत मैट्रिक्स की एक नामित सूची है। contrasts() एक सदिश / कारक लेता है और इसके से विरोधाभासी मैट्रिक्स उत्पन्न करता है। इसके लिए हम अपने डेटा सेट में प्रत्येक कारक पर contrasts() चलाने के लिए lapply() का उपयोग कर सकते हैं, उदाहरण के लिए दिए गए testFrame उदाहरण के लिए:

> lapply(testFrame[,4:5], contrasts, contrasts = FALSE)
$Fourth
        Alice Bob Charlie David
Alice       1   0       0     0
Bob         0   1       0     0
Charlie     0   0       1     0
David       0   0       0     1

$Fifth
        Edward Frank Georgia Hank Isaac
Edward       1     0       0    0     0
Frank        0     1       0    0     0
Georgia      0     0       1    0     0
Hank         0     0       0    1     0
Isaac        0     0       0    0     1

कौन सा स्लॉट्स @ फ़ैबियन का जवाब देते हैं:

model.matrix(~ ., data=testFrame, 
             contrasts.arg = lapply(testFrame[,4:5], contrasts, contrasts=FALSE))
Question

मेरे पास एक data.frame जिसमें निम्न के रूप में देखा गया संख्यात्मक और कारक वैरिएबल शामिल हैं I

testFrame <- data.frame(First=sample(1:10, 20, replace=T),
           Second=sample(1:20, 20, replace=T), Third=sample(1:10, 20, replace=T),
           Fourth=rep(c("Alice","Bob","Charlie","David"), 5),
           Fifth=rep(c("Edward","Frank","Georgia","Hank","Isaac"),4))

मैं एक matrix बनाना चाहता हूं जो कारक को डमी वैरिएबल्स प्रदान करता है और केवल संख्यात्मक चर को छोड़ देता है।

model.matrix(~ First + Second + Third + Fourth + Fifth, data=testFrame)

जैसा कि lm चलने की अपेक्षा होती है, यह संदर्भ स्तर के रूप में प्रत्येक कारक के एक स्तर को छोड़ देता है। हालांकि, मैं सभी कारकों के हर स्तर के लिए एक डमी / सूचक चर के साथ matrix बनाना चाहता हूं। मैं इस मैट्रिक्स का निर्माण glmnet कर रहा glmnet इसलिए मैं glmnet के बारे में चिंतित नहीं हूं।

क्या model.matrix कोई तरीका है। model.matrix कारक के हर स्तर के लिए डमी बनाते हैं?




caret ने 2 लाइनों के साथ इसे प्राप्त करने के लिए एक अच्छा कार्य dummyVars लागू किया:

library(caret) dmy <- dummyVars(" ~ .", data = testFrame) testFrame2 <- data.frame(predict(dmy, newdata = testFrame))

अंतिम कॉलम की जांच कर रहा है:

colnames(testFrame2)

"First"  "Second"         "Third"          "Fourth.Alice"   "Fourth.Bob"     "Fourth.Charlie" "Fourth.David"   "Fifth.Edward"   "Fifth.Frank"   "Fifth.Georgia"  "Fifth.Hank"     "Fifth.Isaac"   

सबसे अच्छी बात यह है कि आप मूल डेटा फ्रेम प्राप्त करते हैं, साथ ही बदली के लिए उपयोग किए गए मूल लोगों को छोड़कर डमी चर।

अधिक जानकारी: http://amunategui.github.io/dummyVar-Walkthrough/




मैं वर्तमान में Lasso मॉडल और glmnet::cv.glmnet() , model.matrix() और Matrix::sparse.model.matrix() (उच्च आयाम मैट्रिक्स के लिए, model.matrix का उपयोग कर सीख रहा हूँ हमारे समय के रूप में सुझाव दिया जाएगा glmnet लेखक।)

बस फ़ैशन और @ गेविन के उत्तर के समान उत्तर पाने के लिए एक साफ़ कोडिंग है। इस बीच, @ asdf123 ने एक और पैकेज library('CatEncoders') भी पेश की

> require('useful')
> # always use all levels
> build.x(First ~ Second + Fourth + Fifth, textFrame, contrasts = FALSE)
> 
> # just use all levels for Fourth
> build.x(First ~ Second + Fourth + Fifth, testFrame, contrasts = c(Fourth = FALSE, Fifth = TRUE))

स्रोत: सभी के लिए आर: उन्नत एनालिटिक्स और ग्राफिक्स (पेज 2 9 3)




आर पैकेज 'CatEncoders' का उपयोग करना

library(CatEncoders)
testFrame <- data.frame(First=sample(1:10, 20, replace=T),
           Second=sample(1:20, 20, replace=T), Third=sample(1:10, 20, replace=T),
           Fourth=rep(c("Alice","Bob","Charlie","David"), 5),
           Fifth=rep(c("Edward","Frank","Georgia","Hank","Isaac"),4))

fit <- OneHotEncoder.fit(testFrame)

z <- transform(fit,testFrame,sparse=TRUE) # give the sparse output
z <- transform(fit,testFrame,sparse=FALSE) # give the dense output