R का उपयोग करके रिज प्रतिगमन के लिए K- गुना या होल्ड-आउट क्रॉस सत्यापन


9

मैं 200 विषयों और 1000 चर के साथ अपने डेटा की भविष्यवाणी के क्रॉस-सत्यापन पर काम कर रहा हूं। मेरी रुचि रिज रिग्रेशन है क्योंकि चरों की संख्या (मैं उपयोग करना चाहता हूं) नमूने की संख्या से अधिक है। इसलिए मैं संकोचन आकलनकर्ताओं का उपयोग करना चाहता हूं। निम्नलिखित उदाहरण डेटा से बना है:

 #random population of 200 subjects with 1000 variables 
    M <- matrix(rep(0,200*100),200,1000)
    for (i in 1:200) {
    set.seed(i)
      M[i,] <- ifelse(runif(1000)<0.5,-1,1)
    }
    rownames(M) <- 1:200

    #random yvars 
    set.seed(1234)
    u <- rnorm(1000)
    g <- as.vector(crossprod(t(M),u))
    h2 <- 0.5 
    set.seed(234)
    y <- g + rnorm(200,mean=0,sd=sqrt((1-h2)/h2*var(g)))

    myd <- data.frame(y=y, M)
myd[1:10,1:10]

y X1 X2 X3 X4 X5 X6 X7 X8 X9
1   -7.443403 -1 -1  1  1 -1  1  1  1  1
2  -63.731438 -1  1  1 -1  1  1 -1  1 -1
3  -48.705165 -1  1 -1 -1  1  1 -1 -1  1
4   15.883502  1 -1 -1 -1  1 -1  1  1  1
5   19.087484 -1  1  1 -1 -1  1  1  1  1
6   44.066119  1  1 -1 -1  1  1  1  1  1
7  -26.871182  1 -1 -1 -1 -1  1 -1  1 -1
8  -63.120595 -1 -1  1  1 -1  1 -1  1  1
9   48.330940 -1 -1 -1 -1 -1 -1 -1 -1  1
10 -18.433047  1 -1 -1  1 -1 -1 -1 -1  1

मैं क्रॉस सत्यापन के लिए निम्नलिखित करना चाहूंगा -

(1) डेटा को दो हिस्सों में विभाजित करें - पहला आधा प्रशिक्षण के रूप में और दूसरा आधा परीक्षण के रूप में

(2) K- गुना क्रॉस सत्यापन (मेरे मामले के लिए किसी भी अन्य उपयुक्त तह पर 10 गुना या सुझाव का स्वागत है)

मैं बस डेटा को दो (नमूना और परीक्षण) में नमूना कर सकता हूं और उनका उपयोग कर सकता हूं:

# using holdout (50% of the data) cross validation 
training.id <- sample(1:nrow(myd), round(nrow(myd)/2,0), replace = FALSE)
test.id <- setdiff(1:nrow(myd), training.id)

 myd_train <- myd[training.id,]
 myd_test  <- myd[test.id,]   

मैं आर पैकेज lm.ridgeसे उपयोग कर रहा हूं MASS

library(MASS)
out.ridge=lm.ridge(y~., data=myd_train, lambda=seq(0, 100,0.001))
plot(out.ridge)
select(out.ridge)

lam=0.001
abline(v=lam)

out.ridge1 =lm.ridge(y~., data=myd_train, lambda=lam)
hist(out.ridge1$coef)
    out.ridge1$ym
hist(out.ridge1$xm)

मेरे दो सवाल हैं -

(1) मैं परीक्षण सेट की भविष्यवाणी कैसे कर सकता हूं और सटीकता की गणना कैसे कर सकता हूं (जैसा कि वास्तविक बनाम भविष्यवाणी का सहसंबंध है)?

(२) मैं K- गुना सत्यापन कैसे कर सकता हूँ? 10 गुना बोलो?


1
यह प्रश्न मददगार है, आंशिक रूप से - आंकड़े.stackexchange.com/questions/23548/…
राम शर्मा

4
आप आर पर लग सकता है rmsपैकेज ols, calibrateऔर validateद्विघात दण्डनीय ठहराए (रिज प्रतिगमन) के साथ कार्य करते हैं।
फ्रैंक हरेल

@FrankHarrell मैंने आपके सुझाव को सभी के लाभ के लिए उत्तर देने की कोशिश की। कृपया एक नज़र डालें !
राम शर्मा

जवाबों:


2

आप इस प्रकार की चीजों के लिए caret पैकेज (विगनेट्स , पेपर ) का उपयोग कर सकते हैं, जो कई मशीन लर्निंग मॉडल को लपेट सकते हैं या आप अपने स्वयं के अनुकूलित मॉडल का उपयोग कर सकते हैं । जैसा कि आप रिज प्रतिगमन में रुचि रखते हैं यहां रिज प्रतिगमन के लिए सिर्फ कस्टम कोड हैं, आप अपनी स्थिति को अधिक सटीक रूप से अपनाना चाह सकते हैं।

डेटा में सरल विभाजन के लिए:

set.seed(107)
# stratified random split of the data
inTrain <- createDataPartition(y = myd$y, p = .5,list = FALSE)
training <- myd[ inTrain,]
testing <- myd[-inTrain,]

K- गुना सत्यापन और डिफ़ॉल्ट बूट सहित सीवी के अन्य प्रकार के लिए

ridgeFit1 <- train(y ~ ., data = training,method = 'ridge', 
preProc = c("center", "scale"), metric = "ROC")
plot(ridgeFit1)

यहांtrain फ़ंक्शन का उपयोग करने के तरीके पर चर्चा की गई है। ध्यान दें कि रिज विधि पैकेज के elasticnetकार्यों पर निर्भर करती है (और इसकी निर्भरता को larsस्थापित किया जाना चाहिए या होना चाहिए)। यदि सिस्टम में स्थापित नहीं है तो पूछेंगे कि क्या आप ऐसा करना चाहते हैं।

उपयोग किए गए रेज़मैपलिंग के प्रकार, साधारण बूटस्ट्रैप का उपयोग डिफ़ॉल्ट रूप से किया जाता है। रेज़मूलेशन विधि को संशोधित करने के लिए, एक ट्रेनकंट्रोल फ़ंक्शन का उपयोग किया जाता है

विकल्प विधि "बूट" के लिए resampling और चूक के प्रकार को नियंत्रित करती है। एक अन्य विधि, "बार-बार दोहराया जाने वाला", बार-बार के-फोल्ड क्रॉस-वैरिफिकेशन को निर्दिष्ट करने के लिए उपयोग किया जाता है (और दोहराता है कि पुनरावृत्ति की संख्या को नियंत्रित करता है)। K को तर्क और संख्या 10 से डिफॉल्ट द्वारा नियंत्रित किया जाता है।

 ctrl <- trainControl(method = "repeatedcv", repeats = 5)

 ridgeFit <- train(y ~ ., data = training,method = 'ridge',
preProc = c("center", "scale"),trControl = ctrl, metric = "ROC")

plot(ridgefit)

भविष्यवाणियों के लिए:

plsClasses <- predict(ridgeFit, newdata = testing)

4

यह टिप्पणियों में फ्रैंक द्वारा सुझाव का विस्तार है। डॉ। हारेल कृपया सही हैं यदि मैं गलत हूं (सुधारों की सराहना करें)।

आपका डेटा:

#random population of 200 subjects with 1000 variables 
    M <- matrix(rep(0,200*100),200,1000)
    for (i in 1:200) {
    set.seed(i)
      M[i,] <- ifelse(runif(1000)<0.5,-1,1)
    }
    rownames(M) <- 1:200

    #random yvars 
    set.seed(1234)
    u <- rnorm(1000)
    g <- as.vector(crossprod(t(M),u))
    h2 <- 0.5 
    set.seed(234)
    y <- g + rnorm(200,mean=0,sd=sqrt((1-h2)/h2*var(g)))

    myd <- data.frame(y=y, M)

rmsपैकेज स्थापित करें और इसे लोड करें ।

require(rms)

ols फ़ंक्शन का उपयोग रैखिक मॉडल अनुमानों के लिए किया जाता है जो साधारण जुर्माना वर्गों का उपयोग करके जुर्माना अवधि निर्दिष्ट कर सकते हैं।

जैसा कि नीचे टिप्पणी में मैंने सुझाव दिया था कि मैंने petraceफ़ंक्शन जोड़ा है। यह फ़ंक्शन AIC और BIC बनाम पेनल्टी का पता लगाता है।

# using holdout (50% of the data) cross validation 
training.id <- sample(1:nrow(myd), round(nrow(myd)/2,0), replace = FALSE)
test.id <- setdiff(1:nrow(myd), training.id)

 myd_train <- myd[training.id,]
 myd_test  <- myd[test.id,] 

frm <- as.formula(paste("y~",paste(names(myd_train)[2:100],collapse="+")))

महत्वपूर्ण नोट मैं सभी 1000 चर का उपयोग नहीं कर सका क्योंकि कार्यक्रम की शिकायत है अगर चर की संख्या 100 से अधिक है। इसके अलावा y~.फार्मूला पदनाम भी काम नहीं करता है। तो समान बनाने के फार्मूला ऑब्जेक्ट के ऊपर देखेंfrm

f <- ols(frm, data = myd_train, method="qr", x=TRUE, y=TRUE)


p <- pentrace(f, seq(.2,1,by=.05))

Error in array(x, c(length(x), 1L), if (!is.null(names(x))) list(names(x),  : 
'data' must be of a vector type, was 'NULL'

 plot(p)

"Lrm या ols से एक साधारण अनपेक्षित आकार के लिए और एक सदिश या दंड की सूची के लिए, दंडित या रैखिक मॉडल की एक श्रृंखला का उपयोग करता है जो दंडित अधिकतम संभावना अनुमान का उपयोग करता है, और स्वतंत्रता की प्रभावी डिग्री बचाता है, Akaike Criterion (AIC), श्वार्ज बायेसियन सूचना मानदंड (बीआईसी), और हर्विच और त्सई का सुधारित एआईसी (एआईसी_सी)। वैकल्पिक दंड कारक मॉडल के विभिन्न प्रकारों को दंडित करने वाले कारकों के इष्टतम जुर्माना कारक या संयोजन के लिए हल करने के लिए nlminb फ़ंक्शन का उपयोग कर सकता है। " से rmsपैकेज मैनुअल।

calibrateफ़ंक्शन मॉडल कैलिब्रेशन को फिर से शुरू करने के लिए है और पूर्वाग्रह-पूर्वक पूर्वानुमानों के आधार पर पूर्वानुमानित बनाम देखे गए मानों के पूर्वाग्रह-सही (ओवरफिटिंग-सही) अनुमान प्राप्त करने के लिए बूटस्ट्रैपिंग या क्रॉस-सत्यापन का उपयोग करता है। validateसमारोह एक प्रतिगमन मॉडल के सत्यापन resampling करता है, के साथ या पीछे स्टेप-डाउन चर विलोपन के बिना। बी = दोहराव की संख्या। विधि के लिए = "क्रॉसवैलिडेशन", छोड़े गए टिप्पणियों के समूहों की संख्या है

cal <- calibrate(f, method = "cross validation", B=20)  
plot(cal)

आप Predictअनुमानित मूल्यों और आत्मविश्वास की सीमा की गणना करने के लिए फ़ंक्शन का उपयोग कर सकते हैं । मुझे यकीन नहीं है कि मैं परीक्षण की स्थिति में काम करता हूं।


अछा लगता है। pentraceफ़ंक्शन का भी उपयोग करें।
फ्रैंक हरेल

@FrankHarrell देखने के लिए धन्यवाद। कृपया मेरे वर्तमान संस्करण पर एक नज़र डालें, मैंने penetranceसमारोह को निष्पादित करते समय त्रुटि सहित कुछ मुद्दों को मारा
राम शर्मा

आप निर्दिष्ट नहीं किया है x=TRUE, y=TRUEकरने के लिए ols। लेकिन एक समस्या यह है कि pentraceजब मॉडल पूरी तरह से ओवरफिट (शून्य का त्रुटि df) है pentrace, तो एक अनपेक्षित मॉडल की जांच करने की कोशिश करता है, जिसमें हैR2=1.0rmsमैंने अगली रिलीज़ के लिए एक नया तर्क जोड़ा है pentrace: noaddzero=TRUEकोशिश करने के लिए दंड की सूची में शून्य न जोड़ना। ध्यान दें कि आपका उदाहरण सबसे अच्छा नहीं है, क्योंकि इष्टतम जुर्माना है
फ्रैंक हरेल

3

आर पैकेज glmnet( विगनेट ) में एक आवरण फ़ंक्शन होता है जो वास्तव में वही करता है जो आप चाहते हैं, जिसे cv.glmnet( डॉक्टर ) कहा जाता है । मैंने कल ही इसका इस्तेमाल किया था, यह एक सपने की तरह काम करता है।


हम इस पैकेज में सामान्य रेखीय प्रतिगमन कैसे कर सकते हैं?
rdorlearn

रेखीय प्रतीपगमन के लिए, वहाँ है cv.lmमें package:DAAG, और एक GLM के लिए वहाँ cv.glmमें package:boot। लेकिन, मुझे लगा कि फ्रैंक हरेल ने सुझाव दिया है rms। मूल रूप से आपको वह करना चाहिए जो वह आपको बताता है। यह भी लगता है कि यह टुकड़े टुकड़े की तुलना में अधिक सामान्य ढांचा है जो मैं वैसे भी सुझा रहा हूं।
छायाकार

glmnetदिलचस्प पैकेज लगता है, जानकारी के लिए धन्यवाद
rdorlearn

1
@rdorlearn रैखिक प्रतिगमन केवल एक पहचान लिंक फ़ंक्शन के साथ एक GLM है।
जो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.