R: Как зациклить множественную линейную регрессию, которая отбрасывает факторы с уровнями <2 - PullRequest
0 голосов
/ 04 февраля 2019

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

Ошибка в contrasts<- (*tmp*, value = contr.funs [1 + isOF [nn]]): контрасты могут применяться только к факторам с 2 или более уровнями *

Прямо сейчас мой код:

df %>% 
  group_by(crop_name) %>% 
    do(tidy(lm(formula = value ~ intercrop + 
erosion_c + purchased_seed + inorg_pest +
 org_pest + landscape + fert + inorgfert,
             data = . )))

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

Есть ли способ в цикле for сказать R, чтобы регрессировать, что он может, отбросить все остальное и избежать этого сообщения об ошибке?

1 Ответ

0 голосов
/ 04 февраля 2019

Я совсем новичок, так что это может быть не лучшим способом.Возможно, вам потребуется настроить цикл for с помощью имя_бавки, поскольку в моем примере df - это ваше подмножество для одной группы культур.

df <- data.frame(intercrop = c("A","B","C","A","B","C"),
                   erosion_c = c("A","D","C","A","B","C"),
                   purchased_seed = c("A","B","D","F","E","C"),
                   inorg_pest = c("A","B","C","A","B","C"),
                   org_pest = c("A","B","A","A","B","B"),
                   landscape = c("A","A","A","A","A","A"),
                   fert = c("A","B","C","A","B","C"),
                   inorgfert = c("A","B","C","A","B","C")
                   )


yo <- sapply(df, levels)
hi <- as.data.frame(c(NA))
for(i in 1:length(yo)){
  hi[i] <- length(yo[[i]])
  names(hi)[i] <- names(df[i])
}

hi <- subset(as.data.frame(t(hi)), V1 >= 2)

formu <- row.names(hi)
formu <- as.formula(paste("value ~ ",gsub('.{3}$', '', paste( unlist(paste(formu,"+ ")), collapse=''))))
...