Можно использовать функцию 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 использует непоследовательно -
против _
, поэтому я использовал _
на всех соответствующих точках в формулах.