我有一个名为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 '
答案 0 :(得分:1)
问题确实与公式有关。以下作品
['15' '9' '3' '35' '3' '18' '2' '32' '10' '3' '37' '28' '13' '24' '31' '1' '25' '18' '11' '22']
问题在于,当您编写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
。