Указание формулы в R с помощью glm без явного объявления каждого ковариата - PullRequest
19 голосов
/ 28 августа 2010

Я хотел бы включить определенные переменные в регрессии glm без полного определения каждой из них.Мой реальный набор данных имеет ~ 200 переменных.До сих пор я не смог найти примеры этого в моем онлайн-поиске.

Например (всего с 3 переменными):

n=200
set.seed(39) 
samp = data.frame(W1 = runif(n, min = 0, max = 1), W2=runif(n, min = 0, max = 5)) 
samp = transform(samp, # add A
A = rbinom(n, 1, 1/(1+exp(-(W1^2-4*W1+1))))) 
samp = transform(samp, # add Y
Y = rbinom(n, 1,1/(1+exp(-(A-sin(W1^2)+sin(W2^2)*A+10*log(W1)*A+15*log(W2)-1+rnorm(1,mean=0,sd=.25))))))

Если я хочу включить все основные терминыэто просто:

glm(Y~., family=binomial, data=samp)

Но скажем, я хочу включить все основные термины (W1, W2 и A) плюс W2 ^ 2:

glm(Y~A+W1+W2+I(W2^2), family=binomial, data=samp)

Есть лиярлык для этого?

[редактирование себя перед публикацией:] Это работает!glm(formula = Y ~ . + I(W2^2), family = binomial, data = samp)

Хорошо, а как насчет этого!

Я хочу опустить одну переменную основных терминов и включить только два основных термина (A, W2) и W2 ^ 2 и W2 ^ 2: A:

glm(Y~A+W2+A*I(W2^2), family=binomial, data=samp)

Очевидно, что всего с несколькими переменными ярлык на самом деле не нужен, но я работаю с многомерными данными.В текущем наборе данных «всего» 200 переменных, а в некоторых других - тысячи и тысячи.

Ответы [ 2 ]

20 голосов
/ 28 августа 2010

Творческое использование . для построения формулы, содержащей все или почти все переменные, является хорошим и чистым подходом. Другой вариант, который иногда полезен, это построить формулу программно как строку, а затем преобразовать ее в формулу, используя as.formula:

vars <- paste("Var",1:10,sep="")
fla <- paste("y ~", paste(vars, collapse="+"))
as.formula(fla)

Конечно, вы можете сделать объект fla более сложным.

14 голосов
/ 29 августа 2010

Анико ответила на ваш вопрос. Чтобы немного расширить:

Вы также можете исключить переменные, используя -:

glm(Y~.-W1+A*I(W2^2), family=binomial, data=samp)

Для больших групп переменных я часто делаю рамку для группировки переменных, которая позволяет вам сделать что-то вроде:

vars <- data.frame(
    names = names(samp),
    main = c(T,F,T,F),
    quadratic =c(F,T,T,F),
    main2=c(T,T,F,F),
    stringsAsFactors=F
)


regform <- paste(
    "Y ~",
    paste(
      paste(vars[vars$main,1],collapse="+"),
      paste(vars[1,1],paste("*I(",vars[vars$quadratic,1],"^2)"),collapse="+"),
      sep="+"
    )
)
> regform
[1] "Y ~ W1+A+W1 *I( W2 ^2)+W1 *I( A ^2)"

> glm(as.formula(regform),data=samp,family=binomial)

Использование всевозможных условий (по имени, по структуре и т.д.) для заполнения фрейма данных позволяет мне быстро выбирать группы переменных в больших наборах данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...