Suponha que eu tenha uma variável de resposta e dados que contenham três covariáveis (como um exemplo de brinquedo):
y = c(1,4,6)
d = data.frame(x1 = c(4,-1,3), x2 = c(3,9,8), x3 = c(4,-4,-2))
Quero ajustar uma regressão linear aos dados:
fit = lm(y ~ d$x1 + d$x2 + d$y2)
Existe uma maneira de escrever a fórmula, para que eu não precise escrever cada covariável individual? Por exemplo, algo como
fit = lm(y ~ d)
(Quero que cada variável no quadro de dados seja uma covariável.) Estou perguntando porque, na verdade, tenho 50 variáveis no meu quadro de dados, por isso quero evitar escrever x1 + x2 + x3 + etc
.
Respostas:
Existe um identificador especial que pode ser usado em uma fórmula para significar todas as variáveis, é o
.
identificador.Você também pode fazer coisas assim, para usar todas as variáveis, exceto uma (neste caso, x3 é excluído):
Tecnicamente,
.
significa todas as variáveis ainda não mencionadas na fórmula . Por exemploonde
.
referenciaria apenasx3
comox1
ex2
já está na fórmula.fonte
.
tecnicamente significa que todas as variáveis aindadata
não estão na fórmula .data
é uma lista da qual as variáveis da fórmula são pesquisadas nessa lista, então sim. Um quadro de dados, lista ou ambiente são opções aceitáveis para odata
argumento. Se não é isso que você quer dizer, precisará expandir um pouco mais.lm(d[[1]] ~ d[[3]] + ., data = d)
names
da lista; dizer que você temll <- list(y = rnorm(10), x = rnorm(10), z = rnorm(10), zz = runif(10))
, em seguida, os seguintes trabalhos:lm(y ~ x + ., data = ll)
. Portanto, não há muitos motivos para ter seus dados assim, a menos que já sejam uma lista, mas funciona. O requisito de que os elementos da fórmula tenham o mesmo comprimento impõe algumas restrições ao que você possui em uma lista. Objetos mais complexos provavelmente precisam de código para extrair os elementos que você deseja; sed[[1]]
fosse um quadro de dados / matriz você precisa código para fazer esse trabalhoUma abordagem um pouco diferente é criar sua fórmula a partir de uma string. Na
formula
página de ajuda, você encontrará o seguinte exemplo:Então, se você olhar para a fórmula gerada, obterá:
fonte
Sim, é claro, basta adicionar a resposta
y
como primeira coluna no quadro de dados e chamarlm()
:Além disso, minhas informações sobre R apontam que a atribuição
<-
é recomendada=
.fonte
foo(bar <- 1:10)
trabalho (ebar
é criado), masfoo(bar = 1:10)
falhariam porquebar
não é um argumentofoo
e também não serão criadasbar
.x3
NA
?Uma extensão do método juba é usar
reformulate
, uma função explicitamente projetada para essa tarefa.Para o exemplo no OP, a solução mais fácil aqui seria
ou
Observe que a adição da variável dependente ao data.frame
d <- cbind(y, d)
é preferida não apenas porque permite o uso dereformulate
, mas também porque permite o uso futuro dolm
objeto em funções comopredict
.fonte
Eu construo esta solução,
reformulate
não tome cuidado se os nomes das variáveis tiverem espaços em branco.`` ``
fonte
Você pode verificar o pacote
leaps
e, em particular, as funções dasregsubsets()
funções para a seleção do modelo. Conforme declarado na documentação:Seleção de modelo por busca exaustiva, substituição progressiva ou progressiva ou sequencial
fonte