在逻辑回归中添加一个虚拟变量向量

Adding a vector of dummy variables in logistic regression

我目前正在尝试进行逻辑回归,其中一个变量是 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,元素是街道。

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')

我认为这可行,因为它们来自同一数据集,并且虚拟对象代表其中一列的每个唯一元素。当我分别输入每个虚拟变量时,它是成功的,但我想压缩回归并使其更有效率。

提前致谢

如果您打算将每种类型的犯罪作为其自身的预测因子,则需要将它们绑定到 train,然后在 lm 公式中指定变量。 (实际上对于 logit 应该是 glm()。)

要获得更紧凑的公式,请在 glm()data= 参数中设置子集 train,以仅包含您的响应变量和预期的设计矩阵。然后使用 street1 ~ . 作为您的公式。

train <- cbind(train, narcotics, theft)I
model.vars <- c("narcotics", "theft", "street1")
logit.mod.train <- glm(street1 ~ ., data = train[,model.vars], family = "binomial")

更多解释:

使用 ifelsetrain 中的每个元素生成 10
当您将 crime.type 定义为 narcotics(其长度为 train)加上任何其他元素时,crime.typetrain 中的行数长。
然后,您要求 lm() 处理一个不平衡的设计矩阵,其中一个预测变量 (crime.type) 中的元素多于其他预测变量。这就是你收到错误的原因。

这里是问题的复制:

N <- 100
train <- data.frame(PRIMARY.DESCRIPTION=sample(c("A","B"), replace = T, size = N),
                    response = rbinom(n=N, prob=0.7, size=1))
dim(train) # 100  2

narcotics <- ifelse(train$PRIMARY.DESCRIPTION == "A", 1, 0) 
length(narcotics) # 100

theft <-  ifelse(train$PRIMARY.DESCRIPTION == "B", 1, 0)
length(theft) # 100

crime.type <- c(desc.A, desc.B)
length(crime.type) # 200

logit.mod.train <- glm(response ~ PRIMARY.DESCRIPTION+crime.type, data = train, family = "binomial")

Error in model.frame.default(formula = response ~ PRIMARY.DESCRIPTION + : variable lengths differ (found for 'crime.type')