Расширение моего комментария здесь. Ваши данные уже находятся в правильном формате для подгонки обобщенной линейной модели с использованием 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'))