Добавление вектора фиктивных переменных в логистическую регрессию

В настоящее время я пытаюсь провести логистическую регрессию, где одна из переменных представляет собой вектор из 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 на самом деле является фиктивной переменной для местоположения преступления на улице. Итак, столбец - МЕСТО.ОПИСАНИЕ, а элемент - улица.

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

Я думал, что это сработает, потому что они получены из одного и того же набора данных, а макеты представляют каждый уникальный элемент одного из столбцов. Когда я ввожу каждую фиктивную переменную отдельно, это успешно, но я хочу сжать регрессию и сделать ее более эффективной.

заранее спасибо


person Community    schedule 26.04.2018    source источник
comment
В сообщении об ошибке указано variable lengths differ. Возможно, это связано с тем, как вы создали crime.type. Вы имели в виду crime.type <- cbind(...)?   -  person Suren    schedule 26.04.2018


Ответы (1)


Если вы хотите, чтобы каждый вид преступления был отдельным предиктором, вам необходимо привязать их к train, а затем указать переменные в формуле lm. (На самом деле для логита это должно быть glm().)

Чтобы получить более компактную формулу, подмножество train в 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) содержит больше элементов, чем другие предикторы. Вот почему вы получаете сообщение об ошибке.

Вот повторение проблемы:

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

Ошибка в model.frame.default (формула = ответ ~ PRIMARY.DESCRIPTION +: различаются длины переменных (найдено для 'Crime.type')

person andrew_reece    schedule 26.04.2018
comment
Спасибо за наш ответ. Я забыл упомянуть, что street1 на самом деле является фиктивной переменной для определения места преступления. Итак, столбец - МЕСТО.ОПИСАНИЕ, а элемент - улица. Итак, код: street1 ‹- ifelse (train $ LOCATION.DESCRIPTION == STREET, 1,0). Приведенный выше код не работал, поэтому, возможно, это связано с этим - person ; 26.04.2018
comment
Неважно. Я понял. Спасибо! Поскольку street1 - фиктивная переменная, я исключил ее из model.vars, и она сработала. - person ; 27.04.2018
comment
Большой! Если это решение помогло вам, отметьте его как принятое, установив флажок рядом с ответом. - person andrew_reece; 28.04.2018