Ссылочный элемент в цикле в R - PullRequest
0 голосов
/ 10 мая 2018

Я хотел бы знать, как ссылаться на элементы в цикле в R. В STATA это делается через `var 'внутри цикла. Я работаю с циклами, и я хочу ссылаться на переменные внутри каждого цикла при регрессии этих переменных в списке переменных (x1 x2 x3). Переменная x1 также имеет суффиксы, чтобы имя можно было разделить на несколько более коротких частей. Код, который я бы сделал в STATA, был бы:

foreach credit in "short_term" "medium_term" "long_term" {
    foreach percentile in "p50" "p75" "p90" {
        foreach type in "high4" "high5" "high6" {
            reg y_-credit' x1_-percentile '_`type' x2 x3 
        }
    }
} 

В R, если я создаю список и создаю цикл, как мне обратиться к каждому элементу в списке? Например:

credit <- c("short_term","medium_term","long_term") 
percentile <- c("p50","p75","p90") 
type <- c("high4","high5","high6") 

for (c in credit) {
    for (p in percentile) {
        for (t in type) {
            baseline_[c]_[p]_[t] <- lm(y_[c] — xl_[p]_[t] + x2 + x3)
        } 
     }
}

А затем получите файл .txt, используя приемник, чтобы собрать все результаты (сводные (базовые) для всех базовых показателей) вместе.

Надеюсь, моя иллюстрация была достаточной для объяснения моих сомнений. Я борюсь с циклами из-за этой (незначительной - по сравнению с STATA-переменной var).

Я жду вашего ответа.

Спасибо, Pranav

1 Ответ

0 голосов
/ 12 мая 2018

Можно использовать функцию formula() для генерации формул из строк в R.

Поскольку OP не воспроизводится, мы продемонстрируем formula(), используя набор данных mtcars:

data(mtcars) # Use motor trend cars data set
dvs <- c("mpg","qsec")
ivs <- c("am","wt","disp")
for(d in dvs){
     for(i in ivs){
          message(paste("d is: ", d, "i is: ",i))
          print(summary(lm(formula(paste(d,"~",i)),mtcars)))
     }
}

... и первая часть вывода:

> for(d in dvs){
+      for(i in ivs){
+           message(paste("d is: ", d, "i is: ",i))
+           print(summary(lm(formula(paste(d,"~",i)),mtcars)))
+      }
+ }
d is:  mpg i is:  am

Call:
lm(formula = formula(paste(d, "~", i)), data = mtcars)

Residuals:
    Min      1Q  Median      3Q     Max 
-9.3923 -3.0923 -0.2974  3.2439  9.5077 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)   17.147      1.125  15.247 1.13e-15 ***
am             7.245      1.764   4.106 0.000285 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 4.902 on 30 degrees of freedom
Multiple R-squared:  0.3598,    Adjusted R-squared:  0.3385 
F-statistic: 16.86 on 1 and 30 DF,  p-value: 0.000285

Поскольку вывод из lm() может быть сохранен в объекте, можно также сгенерировать list()объектов модели и далее манипулировать ими в R.

Чтобы сгенерировать именованные переменные для оператора formula() из векторов, содержащих элементы желаемых имен переменных, можно использовать функции paste() или paste0() ваналогично подходу, принятому выше с набором данных mtcars.paste0() по умолчанию не содержит пробелов между аргументами, где paste() по умолчанию добавляет пробел между аргументами.

Опять же, делая некоторые предположения относительно фактических предполагаемых формул, мы будем использовать вложенные циклы for() OP для генерации строк, которые можно использовать с formula() в функции lm().

# 
# generate formulas using content from OP
# 
credit <- c("short_term","medium_term","long_term") 
percentile <- c("p50","p75","p90") 
type <- c("high4","high5","high6") 

for (c in credit) {
     for (p in percentile) {
          for (t in type) {
               aFormula <- paste0("y_",c," ~ x1-",p,"_",t," + x2 + x3")
               print(aFormula)
          } 
     }
}

... и начало вывода:

> credit <- c("short_term","medium_term","long_term") 
> percentile <- c("p50","p75","p90") 
> type <- c("high4","high5","high6") 
> 
> for (c in credit) {
+      for (p in percentile) {
+           for (t in type) {
+                aFormula <- paste0("y_",c," ~ x1_",p,"_",t," + x2 + x3")
+                print(aFormula)
+           } 
+      }
+ }
[1] "y_short_term ~ x1_p50_high4 + x2 + x3"
[1] "y_short_term ~ x1_p50_high5 + x2 + x3"
[1] "y_short_term ~ x1_p50_high6 + x2 + x3"
[1] "y_short_term ~ x1_p75_high4 + x2 + x3"
[1] "y_short_term ~ x1_p75_high5 + x2 + x3"
[1] "y_short_term ~ x1_p75_high6 + x2 + x3"
[1] "y_short_term ~ x1_p90_high4 + x2 + x3"
[1] "y_short_term ~ x1_p90_high5 + x2 + x3"
[1] "y_short_term ~ x1_p90_high6 + x2 + x3"
[1] "y_medium_term ~ x1_p50_high4 + x2 + x3"
[1] "y_medium_term ~ x1_p50_high5 + x2 + x3"
[1] "y_medium_term ~ x1_p50_high6 + x2 + x3"
. 
. 
. 

Обратите внимание, что содержимое в OP использует непоследовательно - против _, поэтому я использовал _ на всех соответствующих точках в формулах.

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