Estou trabalhando na validação cruzada da previsão dos meus dados com 200 indivíduos e 1000 variáveis. Estou interessado em regressão de cume porque o número de variáveis (eu quero usar) é maior que o número de amostra. Então, eu quero usar estimadores de encolhimento. A seguir, são compostos dados de exemplo:
#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
Gostaria de fazer o seguinte para validação cruzada -
(1) dividir os dados em duas paradas - use a primeira metade como treinamento e a segunda metade como teste
(2) validação cruzada com dobra em K (digamos 10 vezes ou sugestão em qualquer outra dobra apropriada para o meu caso)
Posso simplesmente amostrar os dados em dois (ganho e teste) e usá-los:
# 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,]
Estou usando lm.ridge
do MASS
pacote 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)
Eu tenho duas perguntas -
(1) Como posso prever o conjunto de testes e calcular a precisão (como correlação entre o previsto e o real)?
(2) Como posso executar a validação de dobras em K? digamos 10 vezes?
fonte
rms
pacoteols
,calibrate
evalidate
função com penalização quadrática (regressão cume).Respostas:
Você pode usar
caret
pacotes (vinhetas , papel ) para esse tipo de coisa, que pode agrupar vários modelos de aprendizado de máquina ou usar seus próprios modelos personalizados . Como você está interessado em regressão de cume, aqui estão apenas códigos personalizados para regressão de cume, convém adotar sua situação com mais precisão.Para uma simples divisão de dados:
Para validação K-fold e outro tipo de CV, incluindo inicialização padrão
Aqui está a discussão sobre como usar a
train
função. Observe que o método cume depende daselasticnet
funções do pacote (e sua dependêncialars
, deve ou precisa ser instalada). Se não estiver instalado no sistema, perguntará se você deseja fazê-lo.o tipo de reamostragem usada, O bootstrap simples é usado por padrão. Para modificar o método de reamostragem, uma função trainControl é usada
O método option controla o tipo de reamostragem e o padrão é "boot". Outro método, "repeatcv", é usado para especificar a validação cruzada repetida em dobras K (e o argumento repetido controla o número de repetições). K é controlado pelo argumento numérico e o padrão é 10.
Para previsões:
fonte
Esta é uma extensão da sugestão de Frank nos comentários. Dr. Harrel, por favor, corrija se estou errado (aprecie as correções).
Seus dados:
Instale o
rms
pacote e carregue-o.ols
A função é usada para Estimativa de modelo linear usando mínimos quadrados ordinários, onde é possível especificar o termo da penalidade.Como sugerido abaixo nos comentários, adicionei a
petrace
função. Esta função rastreia AIC e BIC vs Penalidade.Nota importante Eu não poderia usar todas as 1000 variáveis, pois o programa reclama se o número de variáveis exceder 100. Também a
y~.
designação da fórmula do tipo não funcionou. Portanto, veja acima a maneira de fazer o mesmo objeto de fórmula de criaçãofrm
"Para um ajuste comum e não penalizado de lrm ou ols e para um vetor ou lista de multas, se encaixa em uma série de modelos logísticos ou lineares usando a estimativa de máxima verossimilhança penalizada e salva os graus efetivos de liberdade", Schwarz Bayesian Critério de Informação (BIC) e AIC corrigido de Hurvich e Tsai (AIC_c). Opcionalmente, o pentrace pode usar a função nlminb para resolver o fator de penalidade ideal ou a combinação de fatores que penalizam diferentes tipos de termos no modelo ". do
rms
manual do pacote.calibrate
A função destina-se a reamostragem de calibração de modelos e usa inicialização ou validação cruzada para obter estimativas corrigidas de viés (correção de ajuste excessivo) dos valores previstos versus os observados, com base na definição de subconjuntos em intervalos. Avalidate
função faz a reamostragem da validação de um modelo de regressão, com ou sem exclusão de variável de etapa para trás. B = número de repetições. Para method = "crossvalidation", é o número de grupos de observações omitidasVocê pode usar a
Predict
função para calcular valores previstos e limites de confiança. Não tenho certeza se isso funciona na situação de teste.fonte
pentrace
funçãopenetrance
da funçãox=TRUE, y=TRUE
ols
pentrace
pentrace
rms
pentrace
noaddzero=TRUE
O pacote R
glmnet
( vinheta ) possui uma função de wrapper que faz exatamente o que você deseja, chamadacv.glmnet
( doc ). Eu usei ontem ontem, funciona como um sonho.fonte
cv.lm
nopackage:DAAG
, e por um GLM hácv.glm
nopackage:boot
. Mas acabei de perceber que Frank Harrell sugeriurms
. Basicamente, você deve fazer o que ele disser. Também parece que é uma estrutura mais geral do que a que estou sugerindo de qualquer maneira.glmnet
parece interessante pacote, obrigado pela informação