Estou começando a se envolver com o uso de glmnet
com LASSO Regressão onde meu desfecho de interesse é dicotômica. Criei um pequeno quadro de dados simulado abaixo:
age <- c(4, 8, 7, 12, 6, 9, 10, 14, 7)
gender <- c(1, 0, 1, 1, 1, 0, 1, 0, 0)
bmi_p <- c(0.86, 0.45, 0.99, 0.84, 0.85, 0.67, 0.91, 0.29, 0.88)
m_edu <- c(0, 1, 1, 2, 2, 3, 2, 0, 1)
p_edu <- c(0, 2, 2, 2, 2, 3, 2, 0, 0)
f_color <- c("blue", "blue", "yellow", "red", "red", "yellow", "yellow",
"red", "yellow")
asthma <- c(1, 1, 0, 1, 0, 0, 0, 1, 1)
# df is a data frame for further use!
df <- data.frame(age, gender, bmi_p, m_edu, p_edu, f_color, asthma)
As colunas (variáveis) no conjunto de dados acima são as seguintes:
age
(idade da criança em anos) - contínuagender
- binário (1 = masculino; 0 = feminino)bmi_p
(Percentil do IMC) - contínuom_edu
(maior nível de escolaridade da mãe) - ordinal (0 = menor que o ensino médio; 1 = diploma do ensino médio; 2 = diploma de bacharel; 3 = pós-bacharelado)p_edu
(maior nível de escolaridade do pai) - ordinal (o mesmo que m_edu)f_color
(cor primária favorita) - nominal ("azul", "vermelho" ou "amarelo")asthma
(status de asma infantil) - binário (1 = asma; 0 = sem asma)
O objetivo deste exemplo é fazer uso de laço para criar um modelo de predizer o estado de asma da criança a partir da lista de 6 variáveis preditoras potenciais ( age
, gender
, bmi_p
, m_edu
, p_edu
, e f_color
). Obviamente, o tamanho da amostra é um problema aqui, mas espero obter mais informações sobre como lidar com os diferentes tipos de variáveis (isto é, contínuo, ordinal, nominal e binário) dentro da glmnet
estrutura quando o resultado é binário (1 = asma ; 0 = sem asma).
Como tal, alguém estaria disposto a fornecer um exemplo de R
script juntamente com explicações para este exemplo simulado usando o LASSO com os dados acima para prever o status da asma? Embora muito básico, eu sei que eu, e provavelmente muitos outros no CV, apreciariam muito isso!
fonte
dput
de um real objeto R; não faça os leitores colocarem a cobertura por cima, assim como fazer um bolo! Se você gerar o quadro de dados apropriado em R, por exemplofoo
, edite para a pergunta a saída dedput(foo)
.glmnet
ação com um resultado binário.Respostas:
As variáveis categóricas geralmente são primeiro transformadas em fatores, em seguida, uma matriz variável de preditores é criada e, juntamente com os preditores contínuos, é passada para o modelo. Lembre-se de que o glmnet usa penalidades de cume e laço, mas pode ser definido como um ou outro.
Alguns resultados:
Coeficientes podem ser extraídos do glmmod. Aqui é mostrado com 3 variáveis selecionadas.
Por fim, a validação cruzada também pode ser usada para selecionar lambda.
fonte
f_color
variável? O nível de fator 1 a 4 é considerado um passo maior que 1 a 2, ou todos são igualmente ponderados, não direcionais e categóricos? (Eu quero aplicá-la a uma análise com todos os preditores desordenadas.)xfactors <- model.matrix(asthma ~ gender + m_edu + p_edu + f_color)[,-1]
codifica a variável categórica f_color (conforme declaradoas.factor
nas linhas anteriores). Ele deve usar a codificação de variável fictícia R padrão, a menos que ocontrasts.arg
argumento seja fornecido. Isso significa que todos os níveis de f_color são igualmente ponderados e não direcionais, exceto o primeiro que é usado como classe de referência e absorvido pela interceptação.model.matrix(asthma ~ gender + m_edu + p_edu + f_color + age + bmi_p)[, -1]
daria o mesmo resultado que as duas linhas acima? Por que usar uma etapa extra para concatenar as variáveis contínuasdata.frame
?Usarei o pacote enet, pois esse é o meu método preferido. É um pouco mais flexível.
fonte
elasticnet
; no entanto, não sei o que fazer com a saída doR
script acima . Você pode esclarecer por favor? Desde já, obrigado!Apenas para expandir o excelente exemplo fornecido por pat. O problema original colocou variáveis ordinais (m_edu, p_edu), com uma ordem inerente entre os níveis (0 <1 <2 <3). Na resposta original de pat, acho que essas foram tratadas como variáveis categóricas nominais, sem ordem entre elas. Posso estar errado, mas acredito que essas variáveis devem ser codificadas de modo que o modelo respeite sua ordem inerente. Se estes são codificados como fatores ordenados (e não como fatores não ordenados, como na resposta de pat), o glmnet fornece resultados ligeiramente diferentes ... Acho que o código abaixo inclui corretamente as variáveis ordinais como fatores ordenados, e fornece resultados ligeiramente diferentes:
fonte