Написание цикла / функции для генерации различных линейных регрессий на одном и том же кадре данных - PullRequest
0 голосов
/ 14 мая 2019

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

У меня есть такие данные:

dataset <- read.table(text = 
"ID  A_2 B_2 C_2 A_1 B_1 C_1 AGE
M1  10  6   6   8   8   9   25
M2  50  69  54  67  22  44  16
M3  5   80  44  78  5   55  18
M4  60  70  52  89  3   56  28
M5  60  5   34  90  80  56  34
M6  55  55  67  60  100 77  54", header = TRUE, stringsAsFactors = FALSE)

Я строю такие модели:

model1 <- lm(A_2~A_1+age, data=dataset)

model2 <- lm(B_2~B_1+age, data=dataset)

model3 <- lm(C_2~C_1+age, data=dataset)

Мне нужно написать цикл, который:

  • принимает variable _2 (зависимая переменная) и variable _1 (независимыйпеременная) и ковариат, как age ...
  • , создает модели lm и сохраняет выходные данные (т. е. значение Т, значение р, доверительные интервалы и т. д.) в файле данных.затем распечатай.
Dep_va  Ind_var Convarites  Pvalue  "upper.cI" "low.cI" 

A_2 A_1 age         
B_2 B_1 age         
C_2 C_1 age         
D_2 D_1 age         

Ответы [ 3 ]

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

Вот такой подход:

library(tidyverse)

dataset %>% 
  gather(col, val, -ID, -AGE) %>%
  separate(col, c("name", "num")) %>%
  spread(num, val) %>%
  group_by(name) %>%
  group_map(~lm(`2` ~ `1` + AGE, data = .x) %>% broom::tidy())

# A tibble: 9 x 6
# Groups:   name [3]
  name  term        estimate std.error statistic p.value
  <chr> <chr>          <dbl>     <dbl>     <dbl>   <dbl>
1 A     (Intercept)  -15.0      31.5      -0.477  0.666 
2 A     `1`            0.463     0.332     1.39   0.258 
3 A     AGE            0.851     0.731     1.16   0.329 
4 B     (Intercept)   49.1      52.5       0.935  0.419 
5 B     `1`           -0.359     0.801    -0.448  0.685 
6 B     AGE            0.391     2.47      0.159  0.884 
7 C     (Intercept)    5.42     13.9       0.390  0.723 
8 C     `1`            0.932     0.289     3.23   0.0483
9 C     AGE           -0.299     0.470    -0.635  0.570 

Объяснение:

  1. Переместить данные в формат long / tidy с помощью gather()
  2. separate категория переменной (в примере данных, A, B и т. Д.)
  3. Создайте отдельный столбец для IV и DV с помощью spread()
  4. Используйте group_by() и group_map(), чтобы применить lm() к каждой категории переменных.
0 голосов
/ 14 мая 2019

Вот base R подход к проблеме с lapply циклами.

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

dep_vars<-grep("_2$",colnames(dataset),value = T) #This selects all variables ending in `_2` which should all be dependent variables.

reg_vars<-gsub("_2$","",dep_vars) #This removes the `_2` from the dependent variables which should give you the common stem which can be used to select both dependent and independent variables from your data frame.

Затем вы можете использовать это в цикле lapply для создания формул:

full_results <- lapply(reg_vars, function(i) summary(lm(paste0("log(",i,"_2)~",i,"_1+AGE"),data=dataset)))

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

print_results<-lapply(full_results,function(i) data.frame(
                                            Dep_va = names(attributes(i[["terms"]])$dataClasses)[1], 
                                            Ind_var = names(attributes(i[["terms"]])$dataClasses)[2],
                                            Covariates = names(attributes(i[["terms"]])$dataClasses)[3], 
                                            Pvalue = i[["coefficients"]][2,4],
                                            upper.cI = i[["coefficients"]][2,1]+1.96*i[["coefficients"]][2,2],
                                            low.cI = i[["coefficients"]][2,1]-1.96*i[["coefficients"]][2,2]))

Этот код даст вам список фреймов данных, и если вы хотите объединить его в один data.frame:

final_results<-do.call("rbind",print_results)

Вывод результатов:

Dep_va Ind_var Covariates     Pvalue upper.cI     low.cI
1    A_2     A_1        AGE 0.25753805 1.113214 -0.1877324
2    B_2     B_1        AGE 0.68452053 1.211355 -1.9292236
3    C_2     C_1        AGE 0.04827506 1.497688  0.3661343

Надеюсь, это поможет!Дайте мне знать, если вы искали разные результаты.

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

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

var.names <- names(dataset[!names(dataset) %in% c("ID","AGE")])
names.list <- strsplit(var.names,split = "_")
list.of.models <- list()
for (i in 1:length(names.list)) {
DV <- grep(names.list[[i]][1], names(dataset))[1]
IV <- grep(names.list[[i]][1], names(dataset))[2]
  list.of.models[[i]] <- lm(dataset[,DV] ~ dataset[,IV] + AGE, data = dataset)
}

summary(list.of.models[[1]])

Call:
lm(formula = dataset[, DV] ~ dataset[, IV] + AGE, data = dataset)

Residuals:
        1         2         3         4         5         6 
  0.07496  20.42938 -31.36213  10.04093   4.47412  -3.65725 

Coefficients:
                   Estimate Std. Error t value Pr(>|t|)
(Intercept)        -15.0439    31.5482  -0.477    0.666
dataset[, IV]        0.4627     0.3319   1.394    0.258
AGE                  0.8507     0.7314   1.163    0.329

Residual standard error: 22.62 on 3 degrees of freedom
Multiple R-squared:  0.5276,    Adjusted R-squared:  0.2127 
F-statistic: 1.676 on 2 and 3 DF,  p-value: 0.3246
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...