Добавление вектора фиктивных переменных в логистическую регрессию - PullRequest
0 голосов
/ 26 апреля 2018

В настоящее время я пытаюсь провести логистическую регрессию, где одна из переменных является вектором из 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')

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

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

1 Ответ

0 голосов
/ 26 апреля 2018

Если вы хотите, чтобы каждый тип преступления являлся собственным предиктором, вам необходимо привязать их к train, а затем указать переменные в формуле lm.(На самом деле для logit это должно быть 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 ')

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...