具有混合类型解释变量的多项概率回归
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
中找到的所有其他内容,这就是您想要的。
我有一个名为 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
中找到的所有其他内容,这就是您想要的。