что не так с этим кодом для получения статистики после lapply () в R - PullRequest
0 голосов
/ 30 мая 2019

Мои данные примерно такие:

ind1 <- rnorm(99)
ind2 <- rnorm(99)
ind3 <- rnorm(99)
ind4 <- rnorm(99)
ind5 <- rnorm(99)
dep <- rnorm(99, mean=ind1)
group <- rep(c("A", "B", "C"), each=33)
df <- data.frame(dep,group, ind1, ind2, ind3, ind4, ind5)
head(df)

         dep group        ind1       ind2       ind3       ind4          ind5
1 -3.4471651     A -1.61903503  0.8047651 -0.1498872 -0.1421423  0.0003106164
2  1.6097232     A -0.07202246 -1.7419735 -0.4600787 -0.8966089  0.5476866447
3  0.2419204     A  0.37266251  1.1456788  0.2693086 -0.7610068 -0.6588102710
4  0.4157412     A  1.17342107  0.4829935  1.5044331  0.4902491 -0.1845711119
5 -1.1026655     A  0.31428775  0.9488747  0.1806105  0.4187126 -0.4420550339
6  1.9605406     A  1.36719867  1.1116940  0.7026870  0.6450296 -1.0824261091

Следующие строки кода предназначены для запуска линейной модели для всех возможных комбинаций независимых переменных в кадре данных.

После выбора значимых моделей с p <0,05 и ранжирования их по значению AIC я хочу получить следующие выходные данные: уравнение, оценка, R2, прил. R2, значение P, AIC. </p>

Я попробовал это так, но результаты отличаются от того, что я хотел. У кого-нибудь есть идеи, чтобы сделать их правильно?

 indvar_list <- lapply(1:5, function(x) 
   combn(paste0("ind", 1:5), x, , simplify = FALSE))

 formulas_list <- rapply(indvar_list, function(x)
   as.formula(paste("dep ~", paste(x, collapse="+"))))

 mult.lm <- lapply(formulas_list, function(x) glance(lm(as.formula(x), 
 data = df)))

 outputs <- bind_rows(mult.lm, .id = 'index') %>%
   filter(p.value < 0.05) %>%
   arrange(AIC) %>%
   filter(index %in% head(unique(index)))

спасибо заранее!

Ответы [ 2 ]

0 голосов
/ 30 мая 2019

Используйте base::format для получения уравнения и broom::tidy для получения оценок "коэффициентов"

mult.lm <- lapply(formulas_list, function(x) {
mod <- lm(as.formula(x), data = df)
data.frame(model=format(x), tidy(mod), glance(mod), 
           stringsAsFactors = FALSE, row.names = NULL)
})

#To return more clean dataframe
mult.lm <- lapply(formulas_list, function(x) {
mod <- lm(as.formula(x), data = df)
tmod <- tidy(mod)
gmod <- glance(mod)
gmod[2:nrow(tmod),] <- ''

data.frame(model=c(format(x), rep('', nrow(tmod)-1)), tmod, gmod, 
           stringsAsFactors = FALSE, row.names = NULL)
})
0 голосов
/ 30 мая 2019

Похоже, все, что вам не хватает, это уравнение и оценка?В остальном кажется, что это именно то, что вы хотите.Я думаю, проблема в том, что вы используете «взгляд», который не возвращает эти переменные.Я обычно использую summary при попытке получить информацию из моей модели, но это не включает AIC.Это также не очень чисто, чтобы добраться до.Вы можете добавить второй и третий мультлм, которые содержат оценки и имена наших коэффициентов, используемые в модели, склеенные для простоты.

mult.lm_est <- lapply(formulas_list, function(x) paste(summary(lm(as.formula(x), 
                                                       data = df))$coefficients[,1], collapse = ","))

mult.lm_coef <- lapply(formulas_list, function(x) paste(rownames(summary(lm(as.formula(x), 
                                                       data = df))$coefficients), collapse = ","))

Затем вы можете связать строки в этих списках, как вы делали в оригинале, что позволит вам использовать соединения dplyr по индексу

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