具有混合类型解释变量的多项概率回归

Multinomial probit regression with mixed type explanatory variables

我有一个名为 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 

我知道错误与我设置的公式无关,因为即使使用最基本的公式我也会得到同样的错误:

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 '

确实是公式的问题。以下作品

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 中找到的所有其他内容,这就是您想要的。