Je travaille sur la validation croisée de la prédiction de mes données avec 200 sujets et 1000 variables. Je suis intéressé par la régression des crêtes car le nombre de variables (que je veux utiliser) est supérieur au nombre d'échantillons. Je veux donc utiliser des estimateurs de retrait. Voici des exemples de données:
#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
Je voudrais faire ce qui suit pour la validation croisée -
(1) diviser les données en deux - utilisez la première moitié comme formation et la seconde moitié comme test
(2) Validation croisée K-fold (disons 10 fois ou une suggestion sur tout autre pli approprié pour mon cas est la bienvenue)
Je peux simplement échantillonner les données en deux (gagner et tester) et les utiliser:
# 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,]
J'utilise lm.ridge
depuis le MASS
package R.
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)
J'ai deux questions -
(1) Comment puis-je prédire l'ensemble de test et calculer la précision (en tant que corrélation entre le prévu et le réel)?
(2) Comment puis-je effectuer la validation K-fold? dites 10 fois?
la source
rms
paquetols
,calibrate
etvalidate
fonction avec Pénalisation quadratique (régression de crête).Réponses:
Vous pouvez utiliser un
caret
package (vignettes , papier ) pour ce type de choses, qui peut envelopper un certain nombre de modèles d'apprentissage automatique ou vous pouvez utiliser vos propres modèles personnalisés . Comme vous êtes intéressé par la régression des crêtes, voici juste des codes personnalisés pour la régression des crêtes, vous voudrez peut-être vous adapter plus précisément à votre situation.Pour une répartition simple des données:
Pour la validation K-fold et d'autres types de CV, y compris le démarrage par défaut
Voici une discussion sur la façon d'utiliser la
train
fonction. Notez que la méthode ridge dépend des fonctions du packageelasticnet
(et de sa dépendance surlars
, devrait ou doit être installée). S'il n'est pas installé dans le système, il vous demandera si vous souhaitez le faire.le type de rééchantillonnage utilisé, le bootstrap simple est utilisé par défaut.Pour modifier la méthode de rééchantillonnage, une fonction trainControl est utilisée
La méthode d'option contrôle le type de rééchantillonnage et par défaut "boot". Une autre méthode, "repeatcv", est utilisée pour spécifier la validation croisée multipliée par K (et l'argument se répète contrôle le nombre de répétitions). K est contrôlé par l'argument nombre et par défaut à 10.
Pour les prédictions:
la source
Il s'agit d'une extension de la suggestion de Frank dans les commentaires. Dr Harrel, veuillez corriger si je me trompe (veuillez apprécier les corrections).
Vos données:
Installez le
rms
package et chargez-le.ols
La fonction est utilisée pour l'estimation du modèle linéaire en utilisant les moindres carrés ordinaires où peut spécifier le terme de pénalité.Comme suggéré ci-dessous dans les commentaires, j'ai ajouté une
petrace
fonction. Cette fonction trace AIC et BIC vs Penalty.Remarque importante Je n'ai pas pu utiliser les 1000 variables car le programme se plaint si le nombre de variables dépasse 100. De plus, la
y~.
désignation de formule de type n'a pas fonctionné. Donc, voyez ci-dessus la façon de faire la même chose en créant un objet de formulefrm
"Pour un ajustement ordinaire non pénalisé à partir de lrm ou ols et pour un vecteur ou une liste de pénalités, correspond à une série de modèles logistiques ou linéaires utilisant une estimation du maximum de vraisemblance pénalisée et enregistre les degrés de liberté effectifs, Akaike Information Criterion (AIC), Schwarz Bayesian Information Criterion (BIC) et AIC corrigé de Hurvich et Tsai (AIC_c). En option, pentrace peut utiliser la fonction nlminb pour résoudre le facteur de pénalité optimal ou la combinaison de facteurs pénalisant différents types de termes dans le modèle. " du
rms
manuel du paquet.calibrate
La fonction est pour l'étalonnage du modèle de rééchantillonnage et utilise le bootstrap ou la validation croisée pour obtenir des estimations corrigées du biais (sur-ajustées) des valeurs prédites par rapport aux valeurs observées sur la base d'un sous-ensemble des prédictions dans les intervalles. Lavalidate
fonction effectue un rééchantillonnage de validation d'un modèle de régression, avec ou sans suppression de variable descendante descendante. B = nombre de répétitions. Pour method = "crossvalidation", est le nombre de groupes d'observations omisesVous pouvez utiliser la
Predict
fonction pour calculer les valeurs prédites et les limites de confiance. Je ne suis pas sûr que cela fonctionne en situation de test.la source
pentrace
fonction.penetrance
fonctionx=TRUE, y=TRUE
ols
pentrace
pentrace
rms
pentrace
noaddzero=TRUE
Le package R
glmnet
( vignette ) a une fonction wrapper qui fait exactement ce que vous voulez, appeléecv.glmnet
( doc ). Je l'ai utilisé hier, ça marche comme un rêve.la source
cv.lm
en apackage:DAAG
et pour un GLM il ycv.glm
en apackage:boot
. Mais, je viens de réaliser que Frank Harrell l'a suggérérms
. Fondamentalement, vous devez faire tout ce qu'il vous dit. Il semble également que ce soit un cadre plus général que celui fragmentaire que je suggère de toute façon.glmnet
semble paquet intéressant, merci pour l'information