Выбор статистически значимых переменных в модели R glm

У меня есть переменная результата, скажем Y, и список из 100 измерений, которые могут повлиять на Y (скажем, X1 ... X100).

После запуска моего glm и просмотра сводки моей модели я вижу статистически значимые переменные. Я хотел бы иметь возможность выбрать эти переменные, запустить другую модель и сравнить производительность. Есть ли способ проанализировать сводку модели и выбрать только самые важные?


r glm
person Pritish Kakodkar    schedule 22.04.2013    source источник
comment
Попробуйте пакет glmulti.   -  person krlmlr    schedule 22.04.2013
comment
Кроме того, вас следует предостеречь от выбора значимых переменных таким образом. Статистическая значимость может быть изменена добавлением / удалением одной независимой переменной. Ваш вопрос предполагает удаление всех переменных, не имеющих значения при первом запуске. При этом некоторые из изначально значимых переменных станут несущественными, тогда как некоторые из переменных, которые вы удалили, могли иметь хорошую прогностическую ценность. Что вам действительно нужно, так это удаление по одному и пошаговое сравнение соответствия модели. См. Эту ветку: bit.ly/ZLVaD5   -  person Maxim.K    schedule 23.04.2013
comment
См. Также это: statmethods.net/stats/regression.html   -  person Maxim.K    schedule 23.04.2013
comment
@ Maxim.K Пошаговая регрессия не одобряется CrossValidated. Как я сказал в чате, я могу подойти к этой проблеме с помощью лассо. Во всяком случае, здесь это не по теме.   -  person Roland    schedule 23.04.2013


Ответы (4)


Вы можете получить доступ к pvalue результата glm через функцию "summary". Последний столбец матрицы коэффициентов называется «Pr (> | t |)» и содержит p-значения факторов, используемых в модели.

Вот пример:

#x is a 10 x 3 matrix
x = matrix(rnorm(3*10), ncol=3)
y = rnorm(10)
res = glm(y~x)
#ignore the intercept pval
summary(res)$coeff[-1,4] < 0.05
person kith    schedule 22.04.2013

Хотя @kith проложил путь, можно сделать еще больше. Собственно, весь процесс можно автоматизировать. Сначала создадим данные:

x1 <- rnorm(10)
x2 <- rnorm(10)
x3 <- rnorm(10)
y <- rnorm(10)
x4 <- y + 5 # this will make a nice significant variable to test our code
(mydata <- as.data.frame(cbind(x1,x2,x3,x4,y)))

Тогда наша модель:

model <- glm(formula=y~x1+x2+x3+x4,data=mydata)

И логический вектор коэффициентов действительно может быть извлечен следующим образом:

toselect.x <- summary(model)$coeff[-1,4] < 0.05 # credit to kith

Но это не все! Кроме того, мы можем это сделать:

# select sig. variables
relevant.x <- names(toselect.x)[toselect.x == TRUE] 
# formula with only sig variables
sig.formula <- as.formula(paste("y ~",relevant.x))  

РЕДАКТИРОВАТЬ: как указывалось на последующих плакатах, последняя строка должна быть sig.formula <- as.formula(paste("y ~",paste(relevant.x, collapse= "+"))), чтобы включать все переменные.

И запустите регрессию только со значимыми переменными, как изначально хотел OP:

sig.model <- glm(formula=sig.formula,data=mydata)

В этом случае оценка будет равна 1, поскольку мы определили x4 как y + 5, подразумевая идеальную связь.

person Maxim.K    schedule 22.04.2013
comment
Это было здорово, спасибо! Но мне пришлось немного изменить sig.formula, чтобы она работала для меня: sig.formula ‹- as.formula (paste (y ~, paste (related.x, collapse = +))) Без коллапса требуется только имя первой переменной из файла related.x - person ElinaJ; 29.08.2015
comment
Действительно, другие плакаты отметили это. Я включил улучшение в ответ для ясности. - person Maxim.K; 30.08.2015
comment
Когда я это делаю, это не работает для переменных, которые превращаются в факторы. Это можно обойти? - person Alberto MQ; 21.11.2019

Для людей, у которых проблемы с командой Maxim.K на

sig.formula <- as.formula(paste("y ~",relevant.x))

использовать этот

sig.formula <- as.formula(paste("y ~",paste(relevant.x, collapse= "+")))

Окончательные коды будут как

toselect.x <- summary(glmText)$coeff[-1,4] < 0.05 # credit to kith
# select sig. variables
relevant.x <- names(toselect.x)[toselect.x == TRUE] 
# formula with only sig variables
sig.formula <- as.formula(paste("y ~",paste(relevant.x, collapse= "+")))  

это исправляет ошибку, с которой вы сталкиваетесь при выборе только первой переменной.

person Sherl    schedule 23.05.2015

in

sig.formula ‹- as.formula (paste (" y ~ ", related.x))

вы вставляете только первую переменную релевантного .x, остальные игнорируются (попробуйте, например, изменить условие на> 0,5)

person user2347888    schedule 03.05.2013