我目前正在尝试进行逻辑回归,其中一个变量是32个虚拟变量的向量。每个假人代表一种犯罪。例如:
narcotics <- ifelse(train$PRIMARY.DESCRIPTION == "NARCOTICS", 1,0)
然后创建矢量:
crime.type <- c(narcotics, theft, other.offense, burglary, motor.vehicle.theft, battery, robbery, assault, criminal.damage, deceptive.practice, kidnapping, etc.)
逻辑模型如下:
logit.mod.train <- lm(street1 ~ BEAT+WARD+X.COORDINATE+Y.COORDINATE+LATITUDE+LONGITUDE+crime.type, data = train, family = "binomial")
值得注意的是,street1实际上是街道上犯罪地点的虚拟变量。因此列是LOCATION.DESCRIPTION,元素是street。
street1 <- ifelse(train$LOCATION.DESCRIPTION == "STREET", 1,0).
产生此错误:
Error in model.frame.default(formula = street1 ~ BEAT + WARD + X.COORDINATE + :
variable lengths differ (found for 'crime.type')
我认为这会有效,因为它们来自同一个数据集,而虚拟对象代表其中一个列的每个独特元素。当我单独输入每个虚拟变量时,它是成功的,但我想压缩回归并使其更有效。
提前谢谢
答案 0 :(得分:0)
如果您打算将每种类型的犯罪作为自己的预测变量,则需要将它们绑定到train
,然后在lm
公式中指定变量。 (实际上对于logit它应该是glm()
。)
对于更紧凑的公式,train
的{{1}}参数中的子集data=
仅包含您的响应变量和您想要的设计矩阵。然后使用glm()
作为公式。
street1 ~ .
更多解释:
完成后使用train <- cbind(train, narcotics, theft)I
model.vars <- c("narcotics", "theft", "street1")
logit.mod.train <- glm(street1 ~ ., data = train[,model.vars], family = "binomial")
会为ifelse
中的每个元素生成1
或0
。
当您将train
定义为crime.type
(其长度为narcotics
)加上任何其他元素时,train
的长度会超过crime.type
中的行数。
然后你要求train
处理一个不平衡的设计矩阵,其中一个预测变量(lm()
)中的元素比其他预测变量更多。这就是你收到错误的原因。
以下是该问题的复制:
crime.type
model.frame.default中的错误(formula = response~PRIMARY.DESCRIPTION +: 变量长度不同(找到'crime.type')