Как я могу управлять категориальными данными для регрессии logisti c? - PullRequest
0 голосов
/ 06 мая 2020

Я хотел бы выполнить логистическую c регрессию для этого набора данных. Первые три столбца - это переменные-предикторы. Четвертый (значение = Нет) и пятый (значение = Да) столбцы - это переменные ответа. Например, в первой строке находится 53 «нет» и 6 «да». Во второй строке 10 «Нет» и 4 «Да».

Ниже приведена ссылка на данные.

данные

Как преобразовать это во фрейм данных с четырьмя столбцами? Спасибо.

Я хочу примерно следующее:

results

data

Я пробовал использовать функцию glm напрямую:

K1=glm(formula = cbind(notUsing,using) ~ age + education + wantsMore, 
    data = as.data.frame(data_imported), family = "binomial")

Коэффициенты:

> K1$coefficients
 (Intercept)     age25-29     age30-39     age40-49 educationlow wantsMoreyes 
   0.8082200   -0.3893816   -0.9086135   -1.1892389    0.3249947    0.8329548 

1 Ответ

0 голосов
/ 06 мая 2020

Расширение моего комментария здесь. Ваши данные уже находятся в правильном формате для подгонки обобщенной линейной модели с использованием R.

Он довольно хорошо спрятан где-то в документации R, но я уверен, что если вы прочитаете help(formula), help(glm), help(lm) или help(family) где-то есть примечание об этом типе поведения.

В случае, если у вас есть два столбца, в которых указаны success и not success, правильный формат формулы - cbind(success, not success) ~ explanatory variables. Для вашей спецификации c case

glm(cbind(notUsing, Using) ~ age + education + wantsMore, data = [your df here], family = binomial)

может использоваться для установки какой-либо модели.
Это (в некоторой степени) эквивалентно добавлению одинаковой строки для каждого notUsing и Using, например для строки 1 у вас будет 53 строки, где usage = no с age = <25, education = low, wantsMore = yes, и 6 строк, где usage = Yes.

rows <- numeric(sum(df$notUsing + df$Using))
trials <- character(sum(df$notUsing + df$Using))
j <- 1
for(i in 1:nrow(df)){
  ind <- j:(j + df$notUsing[i] + df$using[i] - 1)
  first <- seq(df$notUsing[i])
  trials[ind[first]] <- 'No'
  trials[ind[-first]] <- 'Yes'
  rows[ind] <- i
  j <- j + df$notUsing[i] + df$using[i]
}
df_long <- cbind(df[rows, 1:3], data.frame(usage = trials))
#Identical coefficients, but different deviance and degrees of freedom
print(glm(usage ~ ., data = df_long, family = binomial))
print(glm(cbind(using, notUsing) ~ ., data = df, family = binomial))

#alternative binding methods "hiding" the loop.:
library(dplyr)
library(tidyverse)
rbind(df %>% uncount(notUsing) %>% select(1:3) %>% add_column(usage = 'No'),
df %>% uncount(using) %>% select(1:3) %>% add_column(usage = 'Yes'))
...