在逻辑回归中添加一个虚拟变量向量
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")
更多解释:
使用 ifelse
为 train
中的每个元素生成 1
或 0
。
当您将 crime.type
定义为 narcotics
(其长度为 train
)加上任何其他元素时,crime.type
比 train
中的行数长。
然后,您要求 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')
我目前正在尝试进行逻辑回归,其中一个变量是 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")
更多解释:
使用 ifelse
为 train
中的每个元素生成 1
或 0
。
当您将 crime.type
定义为 narcotics
(其长度为 train
)加上任何其他元素时,crime.type
比 train
中的行数长。
然后,您要求 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')