У меня есть датафрейм с 10 столбцами, как это:

df = structure(list(X1 = c(-0.158841494166799, 1.74997712540787, 
-0.603638753496694, -0.253379995687274, -1.13536828104642, -2.72698649676692, 
0.0243826193956672, 3.21776393858788, -2.3633921387719, 0.0305028420399468, 
-4.26940546325382, 1.55584592541131, -1.05118869595721, -2.84985861365441, 
0.729293004856561, -3.80058253179317, 1.31191742952459, 2.33589025288871, 
-0.315014740930705, 2.92302109498542, 2.26246357678861, 1.37039290089958, 
0.0582396621450368, -0.902295561314538, 2.14889801735908, 0.391493314141552, 
2.33280118206325, -0.0490864536654898, 0.068965431468872, 1.24553936025063
), X2 = c(0.428917030889186, 1.38179284926331, 2.83063848525283, 
-0.926689840680047, -1.3903457418351, 0.708618895316463, -0.750232095654876, 
0.894660121671367, 0.124277732759992, -1.98558522788821, 2.34165530946135, 
2.85945910959032, 2.36563560772223, 0.0185741299096399, -2.48859548768527, 
-1.26592501904523, -0.790849261930494, -0.828149152178906, 3.2014616981455, 
-0.15442363719638, -0.516775154465199, -0.176649448869891, -1.41825025459806, 
2.17806157731774, -0.44973481848562, 2.24655423722927, 2.47628395430464, 
1.91613790409017, -0.393928617864301, -0.148584327095393), X3 = c(-0.430287082709084, 
-0.625327045828844, -0.514958706302276, 0.751266821352889, 1.18006572060265, 
-0.802136052260364, 0, 0.105706401868772, 0.442778243504233, 
0.905950590121364, -1.26899829497004, 0.745801518841586, -0.978033251950966, 
0.113286791573796, 1.20968420311602, -0.635010679093886, 0.858274389205649, 
-1.009308286611, 0, 0.167623720006668, -0.720624475890533, -0.443172067136528, 
-0.0181650919153045, -0.818017257660172, 1.18137870264753, -0.0566121497554404, 
0.572314218120067, -1.01361737919216, 0.637155618813563, 0.00507063594816648
), X4 = c(1.05105923858325, -0.808507106602501, 1.01063388325313, 
-0.363828197971125, -0.889357817262751, 0.0808507106602501, 0, 
0.4851042639615, 0.687231040612125, -1.53616350254475, 2.02126776650625, 
-1.09148459391338, -0.929783172592876, 0.323402842641, 0.768081751272376, 
0.444678908631375, -1.53616350254475, 0.970208527923, 0, 0.646805685282001, 
-1.01063388325313, 0.40425355330125, -0.323402842641, -0.202126776650625, 
1.09148459391338, -0.970208527923, -0.606380329951876, 0, 0.606380329951876, 
0.161701421320499), X5 = c(-1.68622583629267, -2.11651291900176, 
-2.7418399648306, -3.25679867113288, -2.50553184977999, -1.32546612917734, 
-2.12760218143771, -2.12760218143771, -2.02189577956894, -1.5791175360647, 
-0.67316694594334, -1.94216524091338, -1.19636372207179, -2.17439697402276, 
-2.06111018244896, -0.85142597933294, -1.48643665842683, -0.628162269221177, 
-1.63747055583218, -1.63747055583218, -1.46984683582551, -2.19047131171604, 
-2.63364337885257, -2.65180847076788, -3.46982572842805, -2.28844702578052, 
-2.34505917553596, -1.77274495741589, -2.78636233660805, -2.14920671779449
), X6 = c(-3.52265292326337, -2.47159368468012, -3.28010079128262, 
-2.26946690802949, -2.63329510600062, -3.52265292326337, -3.44180221260312, 
-3.44180221260312, -2.95669794864162, -2.26946690802949, -3.80563041057424, 
-1.78436264406799, -2.87584723798137, -3.80563041057424, -3.48222756793324, 
-2.71414581666087, -2.26946690802949, -3.80563041057424, -2.83542188265124, 
-2.83542188265124, -2.18861619736924, -3.19925008062237, -2.79499652732112, 
-3.11839936996212, -3.32052614661274, -2.22904155269937, -3.19925008062237, 
-3.80563041057424, -3.80563041057424, -3.19925008062237), X7 = c(1, 
0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 1, 0, 0, 1, 0, 0), X8 = c(0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0), 
    X9 = c(1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0), X10 = c(3.2936, 
    3.283, 3.264, 3.3162, 3.31, 3.3485, 3.3017, 3.2927, 3.3186, 
    3.3004, 3.3043, 3.0945, 2.7868, 2.7635, 2.749, 2.5605, 2.5571, 
    2.2133, 2.0783, 2.0981, 2.0209, 2.0148, 1.973, 2.0567, 2.0214, 
    2.0315, 2.0057, 2.078, 2.0152, 2.0277)), row.names = c(NA, 
30L), class = "data.frame")


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

p = 3

instru1 = df$X7[1:(30-p)]
instru2 = df$X8[1:(30-p)]
instru3 = df$X9[1:(30-p)]

var <- VAR(df[, c(1:4,10)], p, type = "const")

summary(lm(var$varresult$[# the name of the first variable that appears]$residuals ~ instru1))

linearHypothesis(lm(var$varresult$[# the name of the first variable that appears]$residuals ~ instru1), "instru1 = 0", test = "F", vcov = vcovHAC, type = "HC1")

Я сделал этот код только для instru1 и для одного интересного столбца (столбец 10 в df). Я хотел бы выполнить то же упражнение для instru1, instru2 и instru3 и, в дополнение к

VAR(df[, c(1:4,10)], p, type = "const")

Для

VAR(df[, c(1:4,5)], p, type = "const")

И

VAR(df[, c(1:4,6)], p, type = "const") .

Другими словами, я хотел бы избежать:

p = 3

instru1 = df$X7[1:(30-p)]
instru2 = df$X8[1:(30-p)]
instru3 = df$X9[1:(30-p)]

var1 <- VAR(df[, c(1:4,5)], p, type = "const")

summary(lm(var1$varresult$[# the name of the first variable that appears]$residuals ~ instru1))

linearHypothesis(lm(var1$varresult$[# the name of the first variable that appears]$residuals ~ instru1), "instru1 = 0", test = "F", vcov = vcovHAC, type = "HC1")


var2 <- VAR(df[, c(1:4,6)], p, type = "const")

summary(lm(var2$varresult$[# the name of the first variable that appears]$residuals ~ instru1))

linearHypothesis(lm(var2$varresult$[# the name of the first variable that appears]$residuals ~ instru1), "instru1 = 0", test = "F", vcov = vcovHAC, type = "HC1")

# and then the same but plugging instru2 and instru3 in place of instru1. Is it possible to have all in one loop?

В идеале я хотел бы, чтобы все было в одном цикле, но, если это невозможно, также неплохо иметь код для части VAR, а затем я обновлю бит «instru» вручную.

Кто-нибудь может мне помочь?

Большое спасибо!

2
Rollo99 31 Май 2020 в 13:42

3 ответа

Лучший ответ

Привет Rollo / Arma 91, надеюсь, это ответ на ваш вопрос (обратите внимание, что это не проверено, поскольку используемый пакет не указан).

# Constant: 
p = 3

# Instruments: 
instru_col_seq <- 7:10
instru_list <- vector("list", length(instru_col_seq))
instru_list <- setNames(lapply(instru_col_seq, function(i){
  df[(1:(30-p)), i]
  }
), paste0("instru", 1:length(instru_col_seq)))

# Var Setup:
var_col_seq <- unique(pmin(seq_along(df)+3, ncol(df)))
var_list <- vector("list", length(col_seq))
var_lm_summmary_list <- var_list
var_lh_list <- var_list

# Var computations: 
var_list <- lapply(col_seq, function(j){
    var <- VAR(df[, c(1:4,j)], p, type = "const")
  }
)

# Var lm: 
var_lm_summmary_list <- lapply(seq_along(var_list), function(k){
    summary(lm(var_list[k]$varresult$[names(df)[var_col_seq[k]]]$residuals ~ instru_list[1]))
  }
)

# Var lh: 
var_lh_list <- lapply(seq_along(var_list), function(l){
  linearHypothesis(lm(var$varresult$[names(df)[var_col_seq[l]]]$residuals ~ instru_list[1]),
                   "instru1 = 0", test = "F", vcov = vcovHAC, type = "HC1")
  }
)

Данных:

df <- structure(list(X1 = c(-0.158841494166799, 1.74997712540787, 
-0.603638753496694, -0.253379995687274, -1.13536828104642, -2.72698649676692, 
0.0243826193956672, 3.21776393858788, -2.3633921387719, 0.0305028420399468, 
-4.26940546325382, 1.55584592541131, -1.05118869595721, -2.84985861365441, 
0.729293004856561, -3.80058253179317, 1.31191742952459, 2.33589025288871, 
-0.315014740930705, 2.92302109498542, 2.26246357678861, 1.37039290089958, 
0.0582396621450368, -0.902295561314538, 2.14889801735908, 0.391493314141552, 
2.33280118206325, -0.0490864536654898, 0.068965431468872, 1.24553936025063
), X2 = c(0.428917030889186, 1.38179284926331, 2.83063848525283, 
-0.926689840680047, -1.3903457418351, 0.708618895316463, -0.750232095654876, 
0.894660121671367, 0.124277732759992, -1.98558522788821, 2.34165530946135, 
2.85945910959032, 2.36563560772223, 0.0185741299096399, -2.48859548768527, 
-1.26592501904523, -0.790849261930494, -0.828149152178906, 3.2014616981455, 
-0.15442363719638, -0.516775154465199, -0.176649448869891, -1.41825025459806, 
2.17806157731774, -0.44973481848562, 2.24655423722927, 2.47628395430464, 
1.91613790409017, -0.393928617864301, -0.148584327095393), X3 = c(-0.430287082709084, 
-0.625327045828844, -0.514958706302276, 0.751266821352889, 1.18006572060265, 
-0.802136052260364, 0, 0.105706401868772, 0.442778243504233, 
0.905950590121364, -1.26899829497004, 0.745801518841586, -0.978033251950966, 
0.113286791573796, 1.20968420311602, -0.635010679093886, 0.858274389205649, 
-1.009308286611, 0, 0.167623720006668, -0.720624475890533, -0.443172067136528, 
-0.0181650919153045, -0.818017257660172, 1.18137870264753, -0.0566121497554404, 
0.572314218120067, -1.01361737919216, 0.637155618813563, 0.00507063594816648
), X4 = c(1.05105923858325, -0.808507106602501, 1.01063388325313, 
-0.363828197971125, -0.889357817262751, 0.0808507106602501, 0, 
0.4851042639615, 0.687231040612125, -1.53616350254475, 2.02126776650625, 
-1.09148459391338, -0.929783172592876, 0.323402842641, 0.768081751272376, 
0.444678908631375, -1.53616350254475, 0.970208527923, 0, 0.646805685282001, 
-1.01063388325313, 0.40425355330125, -0.323402842641, -0.202126776650625, 
1.09148459391338, -0.970208527923, -0.606380329951876, 0, 0.606380329951876, 
0.161701421320499), X5 = c(-1.68622583629267, -2.11651291900176, 
-2.7418399648306, -3.25679867113288, -2.50553184977999, -1.32546612917734, 
-2.12760218143771, -2.12760218143771, -2.02189577956894, -1.5791175360647, 
-0.67316694594334, -1.94216524091338, -1.19636372207179, -2.17439697402276, 
-2.06111018244896, -0.85142597933294, -1.48643665842683, -0.628162269221177, 
-1.63747055583218, -1.63747055583218, -1.46984683582551, -2.19047131171604, 
-2.63364337885257, -2.65180847076788, -3.46982572842805, -2.28844702578052, 
-2.34505917553596, -1.77274495741589, -2.78636233660805, -2.14920671779449
), X6 = c(-3.52265292326337, -2.47159368468012, -3.28010079128262, 
-2.26946690802949, -2.63329510600062, -3.52265292326337, -3.44180221260312, 
-3.44180221260312, -2.95669794864162, -2.26946690802949, -3.80563041057424, 
-1.78436264406799, -2.87584723798137, -3.80563041057424, -3.48222756793324, 
-2.71414581666087, -2.26946690802949, -3.80563041057424, -2.83542188265124, 
-2.83542188265124, -2.18861619736924, -3.19925008062237, -2.79499652732112, 
-3.11839936996212, -3.32052614661274, -2.22904155269937, -3.19925008062237, 
-3.80563041057424, -3.80563041057424, -3.19925008062237), X7 = c(1, 
0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 1, 0, 0, 1, 0, 0), X8 = c(0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0), 
X9 = c(1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0), X10 = c(3.2936, 
3.283, 3.264, 3.3162, 3.31, 3.3485, 3.3017, 3.2927, 3.3186, 
3.3004, 3.3043, 3.0945, 2.7868, 2.7635, 2.749, 2.5605, 2.5571, 
2.2133, 2.0783, 2.0981, 2.0209, 2.0148, 1.973, 2.0567, 2.0214, 
2.0315, 2.0057, 2.078, 2.0152, 2.0277)), row.names = c(NA, 
30L), class = "data.frame")
1
hello_friend 31 Май 2020 в 11:37

Я считаю, что лучший способ - написать функцию, обобщающую код VAR/linearHypothesis, и вызывать эту функцию с необходимыми аргументами.

Шаг 1: функция

library(vars)
library(car)

customVAR <- function(DF, Select, Regr, p, type = "const"){
  n <- nrow(DF)
  instru <- DF[[Regr]][seq.int(n - p)]
  var_fit <- VAR(DF[, Select], p = p, type = type)
  r <- resid(var_fit$varresult[[1]])
  lm_fit <- lm(r ~ instru)
  smry <- summary(lm_fit)
  lh <- linearHypothesis(lm_fit, "instru = 0", test = "F", vcov = vcovHAC, type = "HC1")
  list(Summary = smry, linearHyp = lh)
}

Шаг 2: протестируйте его для одной модели

customVAR(df, Select = c(1:4, 10), Regr = 'X7', p = 3)

Шаг 3: установить несколько моделей, варьируя регрессоры

Regr_vec <- paste0('X', 7:9)
var_list <- lapply(Regr_vec, function(R){
  customVAR(df, Select = c(1:4, 10), Regr = R, p = 3)
})

var_list[[2]]$Summary
var_list[[2]]$linearHyp

Шаг 4: варьируйте ответы

Select_list <- list(c(1:4, 10), c(1:4, 5), c(1:4, 6))
var_list2 <- lapply(Select_list, function(S){
  customVAR(df, Select = S, Regr = 'X7', p = 3)
})

var_list2[[3]]$Summary
var_list2[[3]]$linearHyp
2
Rui Barradas 31 Май 2020 в 11:26

Я недавно решил подобную проблему. Что мне помогло, так это использование функции assign() внутри цикла for:

< Сильный > Пример :

 for (i in 1:3){
      assign(x = paste0("variable",i),value = i*10)}

Что автоматизирует процесс ручного задания, например:

variable1 = 10
variable2 = 20
variable3 = 30
1
rkabuk 31 Май 2020 в 11:13