Seleção de características e modelo com glmnet nos dados de metilação (p >> N)

29

Eu gostaria de usar o GLM e o Elastic Net para selecionar esses recursos relevantes + criar um modelo de regressão linear (ou seja, previsão e entendimento, para que seja melhor ficar com relativamente poucos parâmetros). A saída é contínua. São genes por casos. Eu tenho lido sobre o pacote, mas não tenho 100% de certeza sobre as etapas a seguir:2000050glmnet

  1. Execute o CV para escolher lambda:
    cv <- cv.glmnet(x,y,alpha=0.5)
    (Q1) dados os dados de entrada, você escolheria um valor alfa diferente?
    (Q2) preciso fazer outra coisa antes de construir o modelo?

  2. Encaixar no modelo:
    model=glmnet(x,y,type.gaussian="covariance",lambda=cv$lambda.min)
    (Q3) algo melhor que "covariância"?
    (Q4) Se o lambda foi escolhido pelo CV, por que essa etapa precisa nlambda=?
    (Q5) é melhor usar lambda.minou lambda.1se?

  3. Obtenha os coeficientes para ver quais parâmetros caíram ("."):
    predict(model, type="coefficients")

    Na página de ajuda existem muitos predictmétodos (por exemplo, predict.fishnet, predict.glmnet, predict.lognet, etc.). Mas qualquer previsão "simples" como eu vi em um exemplo.
    (Q6) Devo usar predictou predict.glmnetou outro?

Apesar do que li sobre métodos de regularização, sou bastante novo no R e nesses pacotes estatísticos, por isso é difícil ter certeza se estou adaptando meu problema ao código. Todas as sugestões serão bem-vindas.

UPDATE
Com base em "Como observado anteriormente, um objeto de trem de classe contém um elemento chamado finalModel, que é o modelo ajustado com os valores dos parâmetros de ajuste selecionados por reamostragem. Esse objeto pode ser usado da maneira tradicional para gerar previsões para novas amostras, usando o função de previsão do modelo ".

Usando caretpara ajustar alpha e lambda:

  trc = trainControl(method=cv, number=10)  
  fitM = train(x, y, trControl = trC, method="glmnet")  

Será que fitMsubstitua a etapa anterior 2? Se sim, como especificar as opções glmnet ( type.gaussian="naive",lambda=cv$lambda.min/1se) agora?
E o seguinte predictpasso, eu posso substituir modela fitM?

Se eu fizer

  trc = trainControl(method=cv, number=10)  
  fitM = train(x, y, trControl = trC, method="glmnet")  
  predict(fitM$finalModel, type="coefficients")

faz algum sentido ou estou misturando incorretamente o vocabulário de ambos os pacotes?

PGreen
fonte

Respostas:

42

Parte 1

Na rede elástica são empregados dois tipos de restrições nos parâmetros

  1. Restrições de laço (ou seja, no tamanho dos valores absolutos de )βj
  2. Restrições de cume (ou seja, no tamanho dos valores ao quadrado de )βj

α controla a ponderação relativa dos dois tipos. As restrições Lasso permitem a seleção / remoção de variáveis ​​no modelo. As restrições da crista podem lidar com variáveis ​​colineares. O que você coloca mais peso dependerá das propriedades dos dados; muitas variáveis ​​correlacionadas podem precisar de ambas as restrições, algumas variáveis ​​correlacionadas podem sugerir mais ênfase nas restrições de crista.

Uma maneira de resolver isso é tratar como um parâmetro de ajuste ao lado de e usar os valores que apresentam o menor erro CV, da mesma maneira que você está ajustando no momento .αλλcv.glmnet

O cursor do pacote R pode criar modelos usando o pacote glmnet e deve ser configurado para ajustar os parâmetros e .λαλ

Parte 2

Q3

Sim, neste caso em que (número de variáveis número de observações), a página de ajuda para sugerir o usomn?glmnet

type.gaussian = "naive"

Em vez de armazenar todos os produtos internos calculados ao longo do caminho, que podem ser ineficientes com um grande número de variáveis ​​ou quando , a opção será repetida cada vez que for necessário para computar produtos internos.nmn"naive"n

Se você não tivesse especificado esse argumento, glmnetteria escolhido de "naive"qualquer maneira como , mas é melhor especificar isso explicitamente, caso os padrões e as opções sejam alterados posteriormente no pacote e você esteja executando o código em uma data futura.m>500

Q4

Resposta curta, você não precisa especificar um valor alto por nlambdaagora que escolheu um valor ideal, condicionado em . No entanto, se você deseja plotar os caminhos do coeficiente, etc, ter um conjunto modesto de valores de longo do intervalo resulta em um conjunto de caminhos muito mais agradável. A carga computacional de fazer todo o caminho relativo a um específico não é tão grande, o resultado de muito esforço para desenvolver algoritmos para executar esse trabalho corretamente. Gostaria apenas de deixar o padrão, a menos que faça uma diferença apreciável no tempo de computação.λ λα=0.5λλnlambda

Q5

Esta é uma pergunta sobre parcimônia. A lambda.minopção refere-se ao valor de no menor erro de CV. O erro neste valor de é a média dos erros nas dobras e, portanto, essa estimativa do erro é incerta. O representa o valor de na pesquisa que era mais simples que o melhor modelo ( ), mas que possui erro dentro de 1 erro padrão do melhor modelo. Em outras palavras, usar o valor de como o valor selecionado paraλ k λ λ kλλklambda.1seλlambda.minlambda.1seλresulta em um modelo que é ligeiramente mais simples que o melhor, mas que não pode ser distinguido do melhor em termos de erro, dada a incerteza na estimativa CV vezes do erro do melhor modelo.k

A escolha é sua:

  1. O melhor modelo que pode ser muito complexo ou com excesso de ajuste: lambda.min
  2. O modelo mais simples que possui erro comparável ao melhor modelo, dada a incerteza: lambda.1se

Parte 3

Essa é simples e é algo que você encontrará muito com R. Você usa a predict()função 99,9% do tempo. R providenciará o uso da função correta para o objeto fornecido como o primeiro argumento.

Mais tecnicamente, predicté uma função genérica, que possui métodos (versões da função) para objetos de diferentes tipos (tecnicamente conhecidos como classes ). O objeto criado por glmnetpossui uma classe (ou classes) específica, dependendo do tipo de modelo que é realmente ajustado. O glmnet (o pacote) fornece métodos para a predictfunção para esses diferentes tipos de objetos. R conhece esses métodos e escolherá o apropriado com base na classe do objeto fornecido.

Restabelecer Monica - G. Simpson
fonte
2
GRANDE resposta! Eu li agora sobre acento circunflexo. Não tendo 100% de certeza sobre o relacionamento entre o pacote caret e o glmnet, fiz uma atualização na minha pergunta para esclarecer a 'mesclagem' destes para os pacotes ou a troca do glmnet para o caret.
PGreen
1
@PGreen: careté um pacote de wrapper R que agrupa interfaces de função de mais de 100 pacotes ML para ser mais consistente e adiciona CV, pesquisa de grade, modifica padrões de parâmetros insanos etc. Não é sem suas peculiaridades, mas é muito bom e amplamente usado.
smci 01/02
Eu só quero acrescentar que, para o ajuste alfa, você pode usar em cva.glmnet(..)vez de apenas cv.glmnet(...)e ajustar alfa e lambda ao mesmo tempo. Então você pode correr minlossplot(cva.fit)para ver qual alfa dá o melhor resultado. Isso faz parte do glmnetUtils
Espen Riskedal