Извлечение наклонов из нескольких моделей регрессии с использованием dplyr

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

df.dr <- data.frame(
drug = factor(rep(rep(LETTERS[1:4], each = 5), 4)), 
individual = factor(rep(letters[1:4], each = 20)),
dose = rep(c(10,5,1,0.5,0.1), times = 16),
viability = runif(80, min = 50, max = 200))

dfDrugInd = df.dr %>% group_by(drug, individual) %>%
  do(fitAll = lm(viability ~ ., data = .))

dfDrugIndSlope = tidy(dfDrugInd, fitAll)$estimate[2,1]

mean(dfDrugIndSlope)

person Mohieddin Jafari    schedule 21.08.2019    source источник
comment
в вашем коде есть несколько проблем, например, в строке 4 есть отрывок ). Сначала отложите код, если я правильно понимаю ваш вопрос, вы на самом деле просите mixed-effect model для достижения того, что вы хотите, это правильно? Использование group_by и конвейерной логики здесь не работает.   -  person Chuan    schedule 21.08.2019
comment
Спасибо за ваш комментарий. Я исправил проблему. У меня есть несколько переменных, и я хочу вычислить все попарные комбинации этих переменных в отдельных моделях lm. Затем я хочу извлечь наклон каждого из них и вычислить среднее значение наклонов для каждой переменной. Здесь переменными являются индивидуумы. Я хочу сделать это задание для всех препаратов отдельно.   -  person Mohieddin Jafari    schedule 21.08.2019


Ответы (1)


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

Но ваш вопрос, похоже, похож на модель mixed-effect, которую вы можете использовать с пакетом lm4 для достижения своих результатов.

df.dr <- data.frame(
  drug = factor(rep(rep(LETTERS[1:4], each = 5), 4)), 
  individual = factor(rep(letters[1:4], each = 20)),
  dose = rep(c(10,5,1,0.5,0.1), times = 16),
  viability = runif(80, min = 50, max = 200))

# split the dataset by group
df.sp <- split(df.dr, df.dr$drug)

# run separate `lm` on each group and store the results in a list
r <- lapply(df.sp, function(x) do.call("lm", list(viability ~ individual + dose, x)))

# extract the coefficient of target variable, say `individualc`
indi.cof <- sapply(r, function(x)x$coefficients[["individualc"]])

# get the mean
mean(indi.cof)
person Chuan    schedule 21.08.2019
comment
Большое спасибо за код. Я думаю, что это решение, но я также проверю lm4. - person Mohieddin Jafari; 22.08.2019
comment
@MohieddinJafari, если вы считаете, что ответ соответствует вашим потребностям, примите его, нажав зеленую галочку слева. Спасибо! - person Chuan; 22.08.2019