R kullanarak sırt regresyonu için K katlama veya tutma çapraz doğrulaması


9

Verilerimin tahmininin 200 denek ve 1000 değişken ile çapraz doğrulanması üzerinde çalışıyorum. Değişken sayısı (kullanmak istiyorum) örnek sayısından daha büyük olduğu için ridge regresyonuyla ilgileniyorum. Bu yüzden büzülme tahmin edicileri kullanmak istiyorum. Aşağıdaki örnek veriler oluşur:

 #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

Çapraz doğrulama için aşağıdakileri yapmak istiyorum -

(1) verileri iki durağa ayırın - ilk yarısını eğitim, ikinci yarısını test olarak kullanın

(2) K-kat çapraz doğrulama (benim durumum için uygun herhangi bir kat üzerinde 10 kat veya öneri diyelim)

Verileri sadece ikiye (kazanma ve test etme) örnekleyebilir ve kullanabilirim:

# 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,]   

Ben kullanıyorum lm.ridgegelen MASSR paketinde.

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)

İki sorum var -

(1) Test setini nasıl tahmin edebilir ve doğruluğunu hesaplayabilirim (tahmin edilen ile gerçek arasındaki korelasyon olarak)?

(2) K-kat doğrulamasını nasıl yapabilirim? 10 kat mı?


1
bu soru kısmen faydalıdır
Ram Sharma

4
Sen Ar görünebilir rmspaketin ols, calibrateve validatekuadratik penalization (sırt regresyon) ile işlev.
Frank Harrell

@FrankHarrell Herkesin yararına cevap olarak önerinizi genişletmeye çalıştım. Lütfen bir göz at !
Ram Sharma

Yanıtlar:


2

Bu tür şeyler için caret paket (vignnettes , paper ) kullanabilirsiniz , bu da bir dizi makine öğrenme modelini sarabilir veya kendi özelleştirilmiş modellerinizi kullanabilirsiniz . Sırt regresyonuyla ilgileniyorsanız, burada sırt regresyonu için özel kodlar var, durumunuza daha kesin bir şekilde uyum sağlamak isteyebilirsiniz.

Verilerin basit bölünmesi için:

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-kat doğrulaması ve varsayılan önyükleme dahil diğer CV türleri için

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

İştetrain fonksiyonun nasıl kullanılacağı ile ilgili tartışma . Sırt yönteminin paket elasticnetişlevlerine bağlı olduğunu (ve bunun bağlı olması lars, kurulması ya da kurulması gerektiği) unutmayın. Sistemde yüklü değilse bunu yapmak isteyip istemediğinizi soracaktır.

Yeniden örnekleme türü, Basit önyükleme varsayılan olarak kullanılır.Örnekleme yöntemini değiştirmek için bir trainControl işlevi kullanılır

Seçenek yöntemi yeniden örnekleme türünü kontrol eder ve varsayılan olarak "önyükleme" yapar. Başka bir yöntem olan "tekrarlanancv", tekrarlanan K-kat çapraz doğrulamasını belirtmek için kullanılır (ve argüman tekrarları tekrar sayısını kontrol eder). K, sayı bağımsız değişkeni tarafından kontrol edilir ve varsayılan değer 10'dur.

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

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

plot(ridgefit)

Tahminler için:

plsClasses <- predict(ridgeFit, newdata = testing)

4

Bu, yorumlarda Frank'in önerisinin uzantısıdır. Dr.Harrel lütfen yanılıyorsam düzelt (düzeltmeleri takdir et).

Verileriniz:

#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)

rmsPaketi kurun ve yükleyin.

require(rms)

ols işlevi, ceza süresini belirleyebilen Sıradan En Küçük Kareler Kullanılarak Doğrusal Model Tahmini için kullanılır.

Aşağıda önerildiği gibi petracefonksiyon ekledim . Bu işlev AIC ve BIC ile Penaltı arasındaki farkı izler.

# 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="+")))

Önemli not Değişken sayısı 100'ü aşarsa, program şikayet ettiğinden 1000 değişkenin hepsini kullanamadım. Ayrıca y~.formül tanımlaması da işe yaramadı. Aynı oluşturma formül nesnesini yapmanın yukarıdaki yoluna bakınfrm

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 veya ols'den sıradan bir uyumsuzluk ve bir vektör veya ceza listesi için, cezalandırılmış maksimum olabilirlik tahmini kullanarak bir dizi lojistik veya lineer modele uyuyor ve etkili serbestlik derecelerini kaydediyor, Akaike Information Criterion (AIC), Schwarz Bayesian Bilgi Ölçütü (BIC) ve Hurvich ve Tsai'nin düzeltilmiş AIC'si (AIC_c). İsteğe bağlı olarak pentrace, nlminb işlevini kullanarak modeldeki farklı terimleri cezalandıran optimum ceza faktörünü veya faktör kombinasyonunu çözmek için kullanabilir. " dan rmspaket kılavuzuna.

calibrateişlevi, Model Kalibrasyonunu Yeniden Örnekleme içindir ve tahminleri aralıklarla alt kümelendirmeye dayalı olarak tahmin edilen ve gözlemlenen değerlerin önyargı düzeltmeli (aşırı sığdırma - düzeltilmiş) tahminlerini almak için önyükleme veya çapraz doğrulama kullanır. validateFonksiyon ya da geriye doğru bir adım aşağı değişken silme olmayan bir gerileme modeline doğrulama yeniden örnekleme etmez. B = tekrar sayısı. Yöntem = "çapraz validasyon" için, atlanan gözlem gruplarının sayısı

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

PredictTahmini değerleri ve güven sınırlarını hesaplamak için işlevi kullanabilirsiniz . Bunun test durumunda çalıştığından emin değilim.


İyi görünüyor. Ayrıca pentraceişlevi kullanın .
Frank Harrell

@FrankHarrell baktığın için teşekkürler. Lütfen geçerli sürümüme bir göz atın, penetranceişlevi yürütürken hata da dahil olmak üzere birkaç sorunu vurdum
Ram Sharma

Sen belirtmedi x=TRUE, y=TRUEiçin ols. Ancak pentrace, modelin tamamen fazla olduğu (sıfır df sıfır hatası) ile ilgili pentracebir sorun var.R,2=1.0. Bir sonraki sürümü rmsiçin yeni bir argüman ekledim pentrace: noaddzero=TRUEdenemek için ceza listesine sıfır eklememek için. Optimum ceza olduğu için örneğinizin en iyisi olmadığını unutmayın.
Frank Harrell

3

R paketi glmnet( vignette ), tam olarak istediğinizi cv.glmnet( doc ) denen bir sarma işlevine sahiptir . Sadece dün kullandım, bir rüya gibi çalışıyor.


bu pakette genel doğrusal regresyonu nasıl yapabiliriz?
rdorlearn

Doğrusal regresyon için var cv.lmiçinde package:DAAGve bir GLM için var cv.glmiçinde package:boot. Ama Frank Harrell'in önerdiğini fark ettim rms. Temel olarak size söylediklerini yapmalısınız. Yine de önerdiğim parça parça çerçeveden daha genel bir çerçeve gibi görünüyor.
shadowtalker

glmnetilginç bir paket gibi görünüyor, bilgi için teşekkürler
rdorlearn

1
@rdorlearn Doğrusal regresyon, kimlik bağlantısı işlevine sahip bir GLM'dir.
Joe
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.