Полиномиальная пробитная регрессия с объяснительными переменными смешанного типа - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть фрейм данных с именем aggregates, состоящий из числовых столбцов, каждый из которых имеет значительное количество нулевых значений.Я хочу подогнать пробитную модель для каждого столбца, регрессируя их в другой фрейм данных под названием exp_vars.exp_vars состоит из факторов, упорядоченных факторов, целых чисел и чисел.Я попробовал это:

probit_reg = lapply(aggregates, function(y) glm(y ~ subset(exp_vars, select=-c(HH_Net_Income)) + log(exp_vars$HH_Net_Income) + 
log(exp_vars$HH_Net_Income)^2 + log(exp_vars$HH_Net_Income)^3 , data = cbind(y = y, exp_vars)))

Но я получил эту ошибку:

Error in `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]) : 
  contrasts can be applied only to factors with 2 or more levels 

Я знаю, что ошибка не связана с формулой, которую я установил, потому что даже с самой основной формулой Iполучить ту же ошибку:

probit_reg=lapply(aggregates, function(y) glm(y ~ exp_vars, data = cbind(y = y, exp_vars)))

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

Вот воспроизводимый пример:

    aggregates <- data.frame(agg1 =c(1,0,0,0,0), agg2=c(1,1,1,0,1))
    exp_vars <- data.frame(exp1 =c(21:25), exp2=c(11,12,21,22,23), exp3=c(1,0,0,1,1))
    exp_vars$exp2 = ordered(exp_vars$exp2, levels = c('11','12','21','22','23'))
    exp_vars$exp3 = as.factor(exp_vars$exp3)

     agg1 agg2
#1    1    1
#2    0    1
#3    0    1
#4    0    0
#5    0    1

# exp1 exp2 exp3
#1   21   11    1
#2   22   12    0
#3   23   21    0
#4   24   22    1
#5   25   23    1

probit_reg=lapply(aggregates , function(y) glm(y ~ exp_vars ,family = binomial(link = "probit"), data = cbind(y = y, exp_vars)))

#Error in model.frame.default(formula = y ~ exp_vars , data = cbind(y = y, exp_vars ),  : 
  invalid type (list) for variable 'exp_vars '

1 Ответ

0 голосов
/ 10 декабря 2018

Проблема действительно в формуле.Следующие работы

lapply(aggregates , function(y) glm(y ~ . ,family = binomial(link = "probit"), data = cbind(y = y, exp_vars)))

Проблема в том, что когда вы пишете y ~ exp_vars, glm ищет переменную с именем exp_vars и находит фрейм данных, который ему не нравится.Запись

data = cbind(y = y, exp_vars)

не означает, что все столбцы exp_vars могут упоминаться как exp_vars.На самом деле,

cbind(y = 1:5, exp_vars)
#   y exp1 exp2 exp3
# 1 1   21   11    1
# 2 2   22   12    0
# 3 3   23   21    0
# 4 4   24   22    1
# 5 5   25   23    1

Между тем, написание y ~ . означает, что регресс y для всего остального, что вы найдете в data, и это то, что вы хотите.

...