#r
Вопрос:
Приведенный ниже код перебирает примерно 120 переменных в vars
. В настоящее время заполнение файла занимает около 80 секунд, что довольно долго. Мне было любопытно, видел ли кто-нибудь какие-либо низко висящие плоды с точки зрения ускорения моего кода. У меня 32 ядра, но изменение числа ядер = 32 для допараллеля не принесло мне большой пользы. Возможно, переписать цикл for в «применить»?
# rm(list = ls()) #clears the workspace library(plyr) library(ggplot2) library(scales) library(foreach) library(doParallel) library(forecast) # set up options(scipen = 999) #removes scientific notation registerDoParallel(cores = 32) # read data proj_path = "P:/R" Macro lt;- read.csv("P:/Earnest/Old/R/Input.csv") # prep data source("P:/Earnest/Old/R/VarTS.R") #Calls variables cbind.fill lt;- function(...){ nm lt;- list(...) nm lt;- lapply(nm, as.matrix) n lt;- max(sapply(nm, nrow)) do.call(cbind, lapply(nm, function (x) rbind(x, matrix(, n-nrow(x), ncol(x))))) } len lt;- nrow(Macro) # Loads all variable names from Macro and Macro2 vars_macro = names(Macro)[!names(Macro) %in% c("qtrs", "y", "s1", "s2", "s3", "date")] #Returns names in Macro not in "qtrs", "y", "s1", "s2", "s3" vars_macro2 = names(Macro2)[!names(Macro2) %in% c("y", "s1", "s2", "s3")] vars_macro3 = names(Macro3)[!names(Macro3) %in% c("y", "s1", "s2", "s3")] vars_macroall = names(Macroall)[!names(Macroall) %in% c("y", "s1", "s2", "s3")] vars = c(vars_macro, vars_macro2, vars_macro3) consensus = Macro[[2]][len] fit lt;- list() output lt;- list() forecast lt;- list() for(m in vars){ thedata lt;- get(m) output[[m]] lt;- list() # treat output as a list-of-lists fit[[m]] lt;- list() # treat fit as a list-of-lists for(z in rev(1:6)) { tryCatch( #added tryCatch because for loop was breaking on error around number of dimensions expr = { x lt;- thedata[1:(len-z),1:1] x lt;- ts((x), start = c(2016, 3), frequency = 4) y lt;- Macro[1:(len-z),2:2] y lt;- ts((y), start = c(2016, 3), frequency = 4) t lt;- thedata[(len 1-z):(len 1-z),1:1] t lt;- ts((t), start = c(2018, 4), frequency = 4) #fit model fit[[m]][[z]] lt;-auto.arima(y,xreg=x,seasonal=TRUE,parallel = TRUE,num.cores = NULL) #D=1 enforces seasonality output[[m]][[z]] lt;- forecast(fit[[m]][[z]],xreg=t)$mean }, error = function(e){ message("* Caught an error on itertion", m) print(e) } )}} output output2 lt;- matrix(unlist(output), ncol = length(vars)) output2 lt;- output2[nrow(output2):1,] matrixoutput lt;- output2[1:5,1:length(vars)] matrixactual lt;- matrix(Macro[(len-5):(len-1),2:2]) matrixactual lt;- c(matrixactual) MAPE lt;- colMeans(abs((matrixactual - matrixoutput) / matrixactual)) Forecast lt;- output2[6:6,1:length(vars)] Delta lt;- ((Forecast - consensus) / consensus) LastMAPE lt;- abs(((matrixoutput[5:5,] - matrixactual[5:5])/matrixactual[5:5])) df lt;- data.frame(vars,Forecast, MAPE, Delta) dflast lt;- data.frame(vars,Forecast, MAPE, LastMAPE, Delta ) df_macro1 = df[df$vars %in% vars_macro,] df_macro1[17:17,] lt;- NA df lt;- df[with(df, order(MAPE)), ] #sorts after original variables df_macro2 = df[df$vars %in% vars_macro2,] df_macro2$blankVar = NA df_macro3 = df[df$vars %in% vars_macro3,] df_macro3$blankVar = NA df_macroall = df[df$vars %in% vars_macroall,] df_macroall$blankVar = NA df_macro4 = df[df$vars %in% names(Macro4),] df_macro4$blankVar = NA df_macro5 = dflast[dflast$vars %in% vars_macroall,] df_macro5 lt;- df_macro5[with(df_macro5, order(LastMAPE)), ] df_macro5$blankVar = NA df_macro1 lt;- rbind.fill(df_macro1, df_macro5) a = cbind.fill(df_macro1, df_macro2, df_macro3, df_macroall, df_macro4, df, consensus) print(df, row.names = FALSE) write.csv(a, "P:/Earnest/Old/R/OutputTSList.csv", row.names = F, na="")
Не уверен, что это поможет, поставьте предоставление dput(макрос).
dput(Macro) structure(list(qtrs = structure(1:14, .Label = c("15_Q3", "15_Q4", "16_Q1", "16_Q2", "16_Q3", "16_Q4", "17_Q1", "17_Q2", "17_Q3", "17_Q4", "18_Q1", "18_Q2", "18_Q3", "QQ_New"), class = "factor"), y = c(121.3, 131.1, 142.5, 156.4, 168.7, 176.2, 177, 186.6, 199.6, 208.4, 214, 226.2, 232.5, 233.3), c1372 = c(0.51798059487155, 0.605074600778554, 0.70840580233259, 0.796638389230915, 0.800936365512504, 0.862507422705653, 0.906587776772603, 0.965869599669482, 1.02057681299029, 1.0173665712577, 1.00815541019123, 1.11026857023261, 1.12549360199319, 1.17070543044674), c5244 = c(0.0158288398871533, 0.0186529717846534, 0.0335038479568057, 0.0322124481706554, 0.0473432307176583, 0.0372644166954006, 0.055124227441671, 0.0462947124597511, 0.0595395997947759, 0.079813226336006, 0.0632338684298483, 0.0359582444979424, 0.0399978873936274, 0.0363530147033467), c5640 = c(0.0695411232121069, 0.0711030107194139, 0.0768960904393596, 0.0937721113616879, 0.0912072768529112, 0.0948627915873504, 0.0898598251896699, 0.102519015439631, 0.117307571608132, 0.116512410019832, 0.112621649435311, 0.113373707050245, 0.11920732067264, 0.11385677519257), c6164 = c(0.165253620685311, 0.180939722142955, 0.204839371353829, 0.230388360169478, 0.245455819824873, 0.250222069413121, 0.267517323013963, 0.301455130772129, 0.312527568603722, 0.318684362849784, 0.336297671149745, 0.385321973576628, 0.393392171202544, 0.414026295628249), b1372 = c(0.220276379575007, 0.232259423605283, 0.239015099925248, 0.29722406784095, 0.305759227349267, 0.314812674203001, 0.373507924872403, 0.376216626537958, 0.450679682818151, 0.422160030256414, 0.398670890305128, 0.380896038096525, 0.339513818723946, 0.365265284571949), b5244 = c(0.0256963971001724, 0.0308736893223339, 0.0314727889765328, 0.0342560993718647, 0.0329261690808683, 0.0341169107838618, 0.0500316002161605, 0.057066652393088, 0.0637597978553195, 0.102100656473269, 0.109515398926193, 0.0509080775409312, 0.034576665601428, 0.037353167421955), b5640 = c(0.0610914743954476, 0.0681070468175109, 0.0680584203087885, 0.0737178858316377, 0.0657525044040775, 0.0634389081514569, 0.0655890933419926, 0.0689747904574716, 0.0653176858840394, 0.0683221933318993, 0.0692822163266979, 0.0648739229545749, 0.0613089747918081, 0.0681802570906864 ), b6164 = c(0.106769764392002, 0.117293493937739, 0.128632140410947, 0.146139699267301, 0.15999997720466, 0.170137316488036, 0.188733545209946, 0.192072924866328, 0.200314760101575, 0.206572493122192, 0.21531555211795, 0.187877279779437, 0.161952291803993, 0.160944253061549 ), v1372 = c(0.00268999015293817, 0.00312395322452212, 0.00339511453015627, 0.00345686458302532, 0.00342490795325169, 0.0036875222492476, 0.00361618758896395, 0.00355297766248592, 0.00386182842589497, 0.00356454140879668, 0.00347191673410727, 0.00363595803623375, 0.00374222181870868, 0.00371078757415556), v5244 = c(0.000480051602474059, 0.00042588395300854, 0.0005605459198973, 0.000529571165782351, 0.00057240403833901, 0.000468179333138233, 0.000653241119295764, 0.000455570432040571, 0.000535395675184177, 0.00138501873189088, 0.00114060122318986, 0.000320532455933637, 0.000333175133801828, 0.000314970929257286), v5640 = c(0.000839152227642805, 0.000878653169087127, 0.00086250329626335, 0.000928749230480325, 0.000952705037621405, 0.0009145284719627, 0.000862662166602764, 0.000861675351344781, 0.000900555099811469, 0.000846321708899047, 0.000869990227889332, 0.000889602926022706, 0.000847332392691765, 0.000745645512078392 ), v6164 = c(0.00174116886286925, 0.00190736857470478, 0.00204206516831707, 0.00208434471661794, 0.0022434016778137, 0.00215767033473045, 0.00216675412062837, 0.00211218329813293, 0.00222445645154173, 0.00210022505915819, 0.00196775099859493, 0.00205851514065652, 0.00187858647947073, 0.00198038712502613), bv1372 = c(0.00142360941776777, 0.00151188642851632, 0.00157840305106086, 0.00168297006976765, 0.00157809381382463, 0.00180299614944991, 0.00285754565464732, 0.0026777621396315, 0.00314015380649578, 0.00293231409618566, 0.00290686161843522, 0.00248890293023165, 0.00168251123284542, 0.00179265933772828), bv5244 = c(0.000582722401914161, 0.000711777965499918, 0.000761910243648493, 0.000805854835145839, 0.000736857013245957, 0.000833892120648163, 0.0013602408759186, 0.0015050207801102, 0.0016936381650882, 0.00295309680744017, 0.0031773319850428, 0.00106962198904438, 0.000593441969063344, 0.000574791244792 ), bv5640 = c(0.00115351432401665, 0.00132428243672085, 0.00136224787475921, 0.00141606633583978, 0.00116049625522213, 0.000858609082150378, 0.000908098663997447, 0.000935982449156028, 0.000899912473850066, 0.000835053614508394, 0.000872837946479594, 0.000833516238462063, 0.000726891442062557, 0.000774037355521608), bv6164 = c(0.000926271545004555, 0.00105864530300842, 0.00109611375444535, 0.00117219207771791, 0.00122508269987305, 0.00135585463133827, 0.00195926581029822, 0.00187620455518874, 0.00206572868014085, 0.00213169451258196, 0.00205259028597028, 0.00136013066654879, 0.000919533667669498, 0.0010609844820593), s1 = c(1L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 1L, 0L), s2 = c(0L, 1L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 1L), s3 = c(0L, 0L, 1L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 1L, 0L, 0L, 0L), date = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = "2018-09-30", class = "factor")), class = "data.frame", row.names = c(NA, -14L))
Наконец, вот как определены все переменные, т. Е. Ниже приведено то, что содержится в VarTS.R (источник(«P:/Earnest/Old/R/VarTS.R») #Вызывает переменные
#Let's define some variables c1372 lt;- Macro["c1372"] c5244 lt;- Macro["c5244"] c5640 lt;- Macro["c5640"] c6164 lt;- Macro["c6164"] b1372 lt;- Macro["b1372"] b5244 lt;- Macro["b5244"] b5640 lt;- Macro["b5640"] b6164 lt;- Macro["b6164"] v1372 lt;- Macro["v1372"] v5244 lt;- Macro["v5244"] v5640 lt;- Macro["v5640"] v6164 lt;- Macro["v6164"] bv1372 lt;- Macro["bv1372"] bv5244 lt;- Macro["bv5244"] bv5640 lt;- Macro["bv5640"] bv6164 lt;- Macro["bv6164"] X1372C5244C lt;- rowMeans(Macro[c("c1372", "c5244")]) X1372C5640C lt;- rowMeans(Macro[c("c1372", "c5640")]) X1372C6164C lt;- rowMeans(Macro[c("c1372", "c6164")]) X1372C1372B lt;- rowMeans(Macro[c("c1372", "b1372")]) X1372C5244B lt;- rowMeans(Macro[c("c1372", "b5244")]) X1372C5640B lt;- rowMeans(Macro[c("c1372", "b5640")]) X1372C6164B lt;- rowMeans(Macro[c("c1372", "b6164")]) X5244C5640C lt;- rowMeans(Macro[c("c5244", "c5640")]) X5244C6164C lt;- rowMeans(Macro[c("c5244", "c6164")]) X5244C1372B lt;- rowMeans(Macro[c("c5244", "b1372")]) X5244C5244B lt;- rowMeans(Macro[c("c5244", "b5244")]) X5244C5640B lt;- rowMeans(Macro[c("c5244", "b5640")]) X5244C6164B lt;- rowMeans(Macro[c("c5244", "b6164")]) X5640C6164C lt;- rowMeans(Macro[c("c5640", "c6164")]) X5640C1372B lt;- rowMeans(Macro[c("c5640", "b1372")]) X5640C5244B lt;- rowMeans(Macro[c("c5640", "b5244")]) X5640C5640B lt;- rowMeans(Macro[c("c5640", "b5640")]) X5640C6164B lt;- rowMeans(Macro[c("c5640", "b6164")]) X6164C1372B lt;- rowMeans(Macro[c("c6164", "b1372")]) X6164C5244B lt;- rowMeans(Macro[c("c6164", "b5244")]) X6164C5640B lt;- rowMeans(Macro[c("c6164", "b5640")]) X6164C6164B lt;- rowMeans(Macro[c("c6164", "b6164")]) X1372B5244B lt;- rowMeans(Macro[c("b1372", "b5244")]) X1372B5640B lt;- rowMeans(Macro[c("b1372", "b5640")]) X1372B6164B lt;- rowMeans(Macro[c("b1372", "b6164")]) X5244B5640B lt;- rowMeans(Macro[c("b5244", "b5640")]) X5244B6164B lt;- rowMeans(Macro[c("b5244", "b6164")]) X5640B6164B lt;- rowMeans(Macro[c("b5640", "b6164")]) X1372C5640C1372B lt;- rowMeans(Macro[c("c1372", "c5640", "b1372" )]) X1372C5640C5640B lt;- rowMeans(Macro[c("c1372", "c5640", "b5640" )]) X1372C5640C6164B lt;- rowMeans(Macro[c("c1372", "c5640", "b6164" )]) X1372C6164C1372B lt;- rowMeans(Macro[c("c1372", "c6164", "b1372" )]) X1372C6164C5640B lt;- rowMeans(Macro[c("c1372", "c6164", "b5640" )]) X1372C6164C6164B lt;- rowMeans(Macro[c("c1372", "c6164", "b6164" )]) X6164C5640C1372B lt;- rowMeans(Macro[c("c6164", "c5640", "b1372" )]) X6164C5640C5640B lt;- rowMeans(Macro[c("c6164", "c5640", "b5640" )]) X6164C5640C6164B lt;- rowMeans(Macro[c("c6164", "c5640", "b6164" )]) XAll3Card lt;- rowMeans(Macro[c("c1372","c5640","c6164")]) XAll3Card1372B lt;- rowMeans(Macro[c("c1372","c5640","c6164","b1372")]) XAll3Card5640B lt;- rowMeans(Macro[c("c1372","c5640","c6164","b5640")]) XAll3Card6164B lt;- rowMeans(Macro[c("c1372","c5640","c6164","b6164")]) XAll3Bank lt;- rowMeans(Macro[c("b1372","b5640","b6164")]) XAll3Bank1372C lt;- rowMeans(Macro[c("b1372","b5640","b6164","c1372")]) XAll3Bank5640C lt;- rowMeans(Macro[c("b1372","b5640","b6164","c5640")]) XAll3Bank6164C lt;- rowMeans(Macro[c("b1372","b5640","b6164","c6164")]) XAll13725640 lt;- rowMeans(Macro[c("c1372", "b1372", "c5640", "b5640")]) XAll13726164 lt;- rowMeans(Macro[c("c1372", "b1372", "c6164", "b6164")]) XAll56406164 lt;- rowMeans(Macro[c("c5640", "b5640", "c6164", "b6164")]) XAll4Card lt;- rowMeans(Macro[c("c1372", "c5244", "c5640", "c6164")]) XAll4Bank lt;- rowMeans(Macro[c("b1372", "b5244", "b5640", "b6164")]) XAll6 lt;- rowMeans(Macro[c("c1372","c5640","c6164","b1372","b5640","b6164")]) XAll8 lt;- rowMeans(Macro[c("c1372", "c5244", "c5640", "c6164","b1372", "b5244", "b5640", "b6164")]) X1372V5244V lt;- rowMeans(Macro[c("v1372", "v5244")]) X1372V5640V lt;- rowMeans(Macro[c("v1372", "v5640")]) X1372V6164V lt;- rowMeans(Macro[c("v1372", "v6164")]) X1372V1372BV lt;- rowMeans(Macro[c("v1372", "bv1372")]) X1372V5244BV lt;- rowMeans(Macro[c("v1372", "bv5244")]) X1372V5640BV lt;- rowMeans(Macro[c("v1372", "bv5640")]) X1372V6164BV lt;- rowMeans(Macro[c("v1372", "bv6164")]) X5244V5640V lt;- rowMeans(Macro[c("v5244", "v5640")]) X5244V6164V lt;- rowMeans(Macro[c("v5244", "v6164")]) X5244V1372BV lt;- rowMeans(Macro[c("v5244", "bv1372")]) X5244V5244BV lt;- rowMeans(Macro[c("v5244", "bv5244")]) X5244V5640BV lt;- rowMeans(Macro[c("v5244", "bv5640")]) X5244V6164BV lt;- rowMeans(Macro[c("v5244", "bv6164")]) X5640V6164V lt;- rowMeans(Macro[c("v5640", "v6164")]) X5640V1372BV lt;- rowMeans(Macro[c("v5640", "bv1372")]) X5640V5244BV lt;- rowMeans(Macro[c("v5640", "bv5244")]) X5640V5640BV lt;- rowMeans(Macro[c("v5640", "bv5640")]) X5640V6164BV lt;- rowMeans(Macro[c("v5640", "bv6164")]) X6164V1372BV lt;- rowMeans(Macro[c("v6164", "bv1372")]) X6164V5244BV lt;- rowMeans(Macro[c("v6164", "bv5244")]) X6164V5640BV lt;- rowMeans(Macro[c("v6164", "bv5640")]) X6164V6164BV lt;- rowMeans(Macro[c("v6164", "bv6164")]) X1372BV5244BV lt;- rowMeans(Macro[c("bv1372", "bv5244")]) X1372BV5640BV lt;- rowMeans(Macro[c("bv1372", "bv5640")]) X1372BV6164BV lt;- rowMeans(Macro[c("bv1372", "bv6164")]) X5244BV5640BV lt;- rowMeans(Macro[c("bv5244", "bv5640")]) X5244BV6164BV lt;- rowMeans(Macro[c("bv5244", "bv6164")]) X5640BV6164BV lt;- rowMeans(Macro[c("bv5640", "bv6164")]) X1372V5640V1372BV lt;- rowMeans(Macro[c("v1372", "v5640", "bv1372" )]) X1372V5640V5640BV lt;- rowMeans(Macro[c("v1372", "v5640", "bv5640" )]) X1372V5640V6164BV lt;- rowMeans(Macro[c("v1372", "v5640", "bv6164" )]) X1372V6164V1372BV lt;- rowMeans(Macro[c("v1372", "v6164", "bv1372" )]) X1372V6164V5640BV lt;- rowMeans(Macro[c("v1372", "v6164", "bv5640" )]) X1372V6164V6164BV lt;- rowMeans(Macro[c("v1372", "v6164", "bv6164" )]) X6164V5640V1372BV lt;- rowMeans(Macro[c("v6164", "v5640", "bv1372" )]) X6164V5640V5640BV lt;- rowMeans(Macro[c("v6164", "v5640", "bv5640" )]) X6164V5640V6164BV lt;- rowMeans(Macro[c("v6164", "v5640", "bv6164" )]) XAll3CardV lt;- rowMeans(Macro[c("v1372","v5640","v6164")]) XAll3Card1372BV lt;- rowMeans(Macro[c("v1372","v5640","v6164","bv1372")]) XAll3Card5640BV lt;- rowMeans(Macro[c("v1372","v5640","v6164","bv5640")]) XAll3Card6164BV lt;- rowMeans(Macro[c("v1372","v5640","v6164","bv6164")]) XAll3BankV lt;- rowMeans(Macro[c("bv1372","bv5640","bv6164")]) XAll3Bank1372V lt;- rowMeans(Macro[c("bv1372","bv5640","bv6164","v1372")]) XAll3Bank5640V lt;- rowMeans(Macro[c("bv1372","bv5640","bv6164","v5640")]) XAll3Bank6164V lt;- rowMeans(Macro[c("bv1372","bv5640","bv6164","v6164")]) XAll13725640V lt;- rowMeans(Macro[c("v1372", "bv1372", "v5640", "bv5640")]) XAll13726164V lt;- rowMeans(Macro[c("v1372", "bv1372", "v6164", "bv6164")]) XAll56406164V lt;- rowMeans(Macro[c("v5640", "bv5640", "v6164", "bv6164")]) XAll4CardV lt;- rowMeans(Macro[c("v1372", "v5244", "v5640", "v6164")]) XAll4BankV lt;- rowMeans(Macro[c("bv1372", "bv5244", "bv5640", "bv6164")]) XAll6V lt;- rowMeans(Macro[c("v1372","v5640","v6164","bv1372","bv5640","bv6164")]) XAll8V lt;- rowMeans(Macro[c("v1372", "v5244", "v5640", "v6164","bv1372", "bv5244", "bv5640", "bv6164")]) X1372C5244C lt;- data.frame(X1372C5244C) X1372C5640C lt;- data.frame(X1372C5640C) X1372C6164C lt;- data.frame(X1372C6164C) X1372C1372B lt;- data.frame(X1372C1372B) X1372C5244B lt;- data.frame(X1372C5244B) X1372C5640B lt;- data.frame(X1372C5640B) X1372C6164B lt;- data.frame(X1372C6164B) X5244C5640C lt;- data.frame(X5244C5640C) X5244C6164C lt;- data.frame(X5244C6164C) X5244C1372B lt;- data.frame(X5244C1372B) X5244C5244B lt;- data.frame(X5244C5244B) X5244C5640B lt;- data.frame(X5244C5640B) X5244C6164B lt;- data.frame(X5244C6164B) X5640C6164C lt;- data.frame(X5640C6164C) X5640C1372B lt;- data.frame(X5640C1372B) X5640C5244B lt;- data.frame(X5640C5244B) X5640C5640B lt;- data.frame(X5640C5640B) X5640C6164B lt;- data.frame(X5640C6164B) X6164C1372B lt;- data.frame(X6164C1372B) X6164C5244B lt;- data.frame(X6164C5244B) X6164C5640B lt;- data.frame(X6164C5640B) X6164C6164B lt;- data.frame(X6164C6164B) X1372B5244B lt;- data.frame(X1372B5244B) X1372B5640B lt;- data.frame(X1372B5640B) X1372B6164B lt;- data.frame(X1372B6164B) X5244B5640B lt;- data.frame(X5244B5640B) X5244B6164B lt;- data.frame(X5244B6164B) X5640B6164B lt;- data.frame(X5640B6164B) X1372C5640C1372B lt;- data.frame(X1372C5640C1372B) X1372C5640C5640B lt;- data.frame(X1372C5640C5640B) X1372C5640C6164B lt;- data.frame(X1372C5640C6164B) X1372C6164C1372B lt;- data.frame(X1372C6164C1372B) X1372C6164C5640B lt;- data.frame(X1372C6164C5640B) X1372C6164C6164B lt;- data.frame(X1372C6164C6164B) X6164C5640C1372B lt;- data.frame(X6164C5640C1372B) X6164C5640C5640B lt;- data.frame(X6164C5640C5640B) X6164C5640C6164B lt;- data.frame(X6164C5640C6164B) XAll3Card lt;- data.frame(XAll3Card) XAll3Card1372B lt;- data.frame(XAll3Card1372B) XAll3Card5640B lt;- data.frame(XAll3Card5640B) XAll3Card6164B lt;- data.frame(XAll3Card6164B) XAll3Bank lt;- data.frame(XAll3Bank) XAll3Bank1372C lt;- data.frame(XAll3Bank1372C) XAll3Bank5640C lt;- data.frame(XAll3Bank5640C) XAll3Bank6164C lt;- data.frame(XAll3Bank6164C) XAll13725640 lt;- data.frame(XAll13725640) XAll13726164 lt;- data.frame(XAll13726164) XAll56406164 lt;- data.frame(XAll56406164) XAll4Card lt;- data.frame(XAll4Card) XAll4Bank lt;- data.frame(XAll4Bank) XAll6 lt;- data.frame(XAll6) XAll8 lt;- data.frame(XAll8) X1372V5244V lt;- data.frame(X1372V5244V) X1372V5640V lt;- data.frame(X1372V5640V) X1372V6164V lt;- data.frame(X1372V6164V) X1372V1372BV lt;- data.frame(X1372V1372BV) X1372V5244BV lt;- data.frame(X1372V5244BV) X1372V5640BV lt;- data.frame(X1372V5640BV) X1372V6164BV lt;- data.frame(X1372V6164BV) X5244V5640V lt;- data.frame(X5244V5640V) X5244V6164V lt;- data.frame(X5244V6164V) X5244V1372BV lt;- data.frame(X5244V1372BV) X5244V5244BV lt;- data.frame(X5244V5244BV) X5244V5640BV lt;- data.frame(X5244V5640BV) X5244V6164BV lt;- data.frame(X5244V6164BV) X5640V6164V lt;- data.frame(X5640V6164V) X5640V1372BV lt;- data.frame(X5640V1372BV) X5640V5244BV lt;- data.frame(X5640V5244BV) X5640V5640BV lt;- data.frame(X5640V5640BV) X5640V6164BV lt;- data.frame(X5640V6164BV) X6164V1372BV lt;- data.frame(X6164V1372BV) X6164V5244BV lt;- data.frame(X6164V5244BV) X6164V5640BV lt;- data.frame(X6164V5640BV) X6164V6164BV lt;- data.frame(X6164V6164BV) X1372BV5244BV lt;- data.frame(X1372BV5244BV) X1372BV5640BV lt;- data.frame(X1372BV5640BV) X1372BV6164BV lt;- data.frame(X1372BV6164BV) X5244BV5640BV lt;- data.frame(X5244BV5640BV) X5244BV6164BV lt;- data.frame(X5244BV6164BV) X5640BV6164BV lt;- data.frame(X5640BV6164BV) X1372V5640V1372BV lt;- data.frame(X1372V5640V1372BV) X1372V5640V5640BV lt;- data.frame(X1372V5640V5640BV) X1372V5640V6164BV lt;- data.frame(X1372V5640V6164BV) X1372V6164V1372BV lt;- data.frame(X1372V6164V1372BV) X1372V6164V5640BV lt;- data.frame(X1372V6164V5640BV) X1372V6164V6164BV lt;- data.frame(X1372V6164V6164BV) X6164V5640V1372BV lt;- data.frame(X6164V5640V1372BV) X6164V5640V5640BV lt;- data.frame(X6164V5640V5640BV) X6164V5640V6164BV lt;- data.frame(X6164V5640V6164BV) XAll3CardV lt;- data.frame(XAll3CardV) XAll3Card1372BV lt;- data.frame(XAll3Card1372BV) XAll3Card5640BV lt;- data.frame(XAll3Card5640BV) XAll3Card6164BV lt;- data.frame(XAll3Card6164BV) XAll3BankV lt;- data.frame(XAll3BankV) XAll3Bank1372V lt;- data.frame(XAll3Bank1372V) XAll3Bank5640V lt;- data.frame(XAll3Bank5640V) XAll3Bank6164V lt;- data.frame(XAll3Bank6164V) XAll13725640V lt;- data.frame(XAll13725640V) XAll13726164V lt;- data.frame(XAll13726164V) XAll56406164V lt;- data.frame(XAll56406164V) XAll4CardV lt;- data.frame(XAll4CardV) XAll4BankV lt;- data.frame(XAll4BankV) XAll6V lt;- data.frame(XAll6V) XAll8V lt;- data.frame(XAll8V) s1 lt;- Macro["s1"] s2 lt;- Macro["s2"] s3 lt;- Macro["s3"] y lt;- Macro["y"] Macro2 lt;- data.frame(y, X1372C5244C, X1372C5640C, X1372C6164C, X1372C1372B, X1372C5244B, X1372C5640B, X1372C6164B, X5244C5640C, X5244C6164C, X5244C1372B, X5244C5244B, X5244C5640B, X5244C6164B, X5640C6164C, X5640C1372B, X5640C5244B, X5640C5640B, X5640C6164B, X6164C1372B, X6164C5244B, X6164C5640B, X6164C6164B, X1372B5244B, X1372B5640B, X1372B6164B, X5244B5640B, X5244B6164B, X5640B6164B, X1372C5640C1372B, X1372C5640C5640B, X1372C5640C6164B, X1372C6164C1372B, X1372C6164C5640B, X1372C6164C6164B, X6164C5640C1372B, X6164C5640C5640B, X6164C5640C6164B, XAll3Card, XAll3Card1372B, XAll3Card5640B, XAll3Card6164B, XAll3Bank, XAll3Bank1372C, XAll3Bank5640C, XAll3Bank6164C, XAll13725640, XAll13726164, XAll56406164, XAll4Card, XAll4Bank, XAll6, XAll8, s1, s2, s3) Macro3 lt;- data.frame(y, X1372V5244V, X1372V5640V, X1372V6164V, X1372V1372BV, X1372V5244BV, X1372V5640BV, X1372V6164BV, X5244V5640V, X5244V6164V, X5244V1372BV, X5244V5244BV, X5244V5640BV, X5244V6164BV, X5640V6164V, X5640V1372BV, X5640V5244BV, X5640V5640BV, X5640V6164BV, X6164V1372BV, X6164V5244BV, X6164V5640BV, X6164V6164BV, X1372BV5244BV, X1372BV5640BV, X1372BV6164BV, X5244BV5640BV, X5244BV6164BV, X5640BV6164BV, X1372V5640V1372BV, X1372V5640V5640BV, X1372V5640V6164BV, X1372V6164V1372BV, X1372V6164V5640BV, X1372V6164V6164BV, X6164V5640V1372BV, X6164V5640V5640BV, X6164V5640V6164BV, XAll3CardV, XAll3Card1372BV, XAll3Card5640BV, XAll3Card6164BV, XAll3BankV, XAll3Bank1372V, XAll3Bank5640V, XAll3Bank6164V, XAll13725640V, XAll13726164V, XAll56406164V, XAll4CardV, XAll4BankV, XAll6V, XAll8V, s1, s2, s3) Macro4 lt;- data.frame(c5640, c6164, b5640, b6164, v5640, v6164, bv5640, bv6164, X5640C6164C, X5640C5640B, X5640C6164B, X6164C5640B, X6164C6164B, X5640B6164B, X6164C5640C5640B, X6164C5640C6164B, XAll56406164, X5640V6164V, X5640V5640BV, X5640V6164BV, X6164V5640BV, X6164V6164BV, X5640BV6164BV, X6164V5640V5640BV, X6164V5640V6164BV, XAll56406164V) Macroall lt;- data.frame(y, c1372, c5640, c6164, b1372, b5640, b6164, v1372, v5640, v6164, bv1372, bv5640, bv6164, X1372C5640C, X1372C6164C, X1372C1372B, X1372C5640B, X1372C6164B, X5640C6164C, X5640C1372B, X5640C5640B, X5640C6164B, X6164C1372B, X6164C5640B, X6164C6164B, X1372B5640B, X1372B6164B, X5640B6164B, X1372C5640C1372B, X1372C5640C5640B, X1372C5640C6164B, X1372C6164C1372B, X1372C6164C5640B, X1372C6164C6164B, X6164C5640C1372B, X6164C5640C5640B, X6164C5640C6164B, XAll3Card, XAll3Card1372B, XAll3Card5640B, XAll3Card6164B, XAll3Bank, XAll3Bank1372C, XAll3Bank5640C, XAll3Bank6164C, XAll13725640, XAll13726164, XAll56406164, XAll6, X1372V5640V, X1372V6164V, X1372V1372BV, X1372V5640BV, X1372V6164BV, X5640V6164V, X5640V1372BV, X5640V5640BV, X5640V6164BV, X6164V1372BV, X6164V5640BV, X6164V6164BV, X1372BV5640BV, X1372BV6164BV, X5640BV6164BV, X1372V5640V1372BV, X1372V5640V5640BV, X1372V5640V6164BV, X1372V6164V1372BV, X1372V6164V5640BV, X1372V6164V6164BV, X6164V5640V1372BV, X6164V5640V5640BV, X6164V5640V6164BV, XAll3CardV, XAll3Card1372BV, XAll3Card5640BV, XAll3Card6164BV, XAll3BankV, XAll3Bank1372V, XAll3Bank5640V, XAll3Bank6164V, XAll13725640V, XAll13726164V, XAll56406164V, XAll6V, s1, s2, s3)
Комментарии:
1. Что это
c(vars_macro, vars_macro2, vars_macro3)
такое ?2. Цикл проходит по списку переменных, содержащихся в vars.
3. Вам необходимо предоставить
c(vars_macro, vars_macro2, vars_macro3)
. Ваш код не может быть запущен как есть.4. Важно увидеть, какой результат вы хотите получить. Теперь ваш код можно запускать.
5. Я не думаю, что ваш код в том виде, в каком он написан в настоящее время, использует преимущества параллельных ядер. Причина, по которой ваш код не ускорился после регистрации ядер, заключается в том, что цикл for автоматически не использует преимущества параллельных ядер. Вам нужно использовать
foreach
функцию или функции изfuture
пакета, как это делает ответ @Cole. Это будет иметь гораздо большее значение, чем переход от цикла for к лапли.
Ответ №1:
Это auto.arima
занимает большую часть времени, что означает, что оптимизации не так много. Каждая auto.arima
занимает около 200 миллисекунд. 1:6
умножить 16 столбцов на 200 миллисекунд-это 19,2 секунды. На моей машине выполнение этого решения занимает около 22 секунд без включения каких-либо параллельных ядер. Не слишком потертые накладные расходы. Окончательное редактирование: С future_lapply
помощью , я получил его от 22 секунд до 12 секунд на своем 2-ядерном i3. С 32-ядрами вы должны выглядеть довольно хорошо.
Самое большое изменение заключается в том, что я подмножествую ваш Macro
один раз для каждого цикла временных рядов (т. Е. rev(1:6)
). Это помогает не повторять y
подмножество для каждого имени varname.
Затем вместо явного цикла lapply
используется цикл, который должен быть быстрее, чем for
цикл.
И последнее замечание: я все еще не мог запустить ваш код, поэтому я не уверен, что это ваши ожидаемые результаты.
library(future.apply) plan(multiprocess) all_outputs lt;- lapply(6:1, function (z) { x1 lt;- ts(Macro[-z, vars], start = c(2016, 3), frequency = 4) y1 lt;- ts(Macro[-z, 'y'], start = c(2016, 3), frequency = 4) t1 lt;- ts(Macro[nrow(Macro)-z 1, vars], start = c(2018, 4), frequency = 4) fits lt;- future_lapply(x1, function(x) auto.arima( y = y1, xreg = x, seasonal = TRUE )) outputs lt;- lapply(vars, function(x) x = forecast(fits[[x]], xreg = t1[, x])$mean) names(outputs) lt;- vars outputs } ) #if you have data.table data.table::rbindlist(all_outputs) #or base works fine as well do.call(rbind, all_outputs)
правка2: результаты
gt; do.call(rbind, all_outputs) c1372 c5244 c5640 c6164 b1372 b5244 b5640 [1,] 207.3153 243.6196 240.3115 195.4832 244.7843 231.6605 236.5413 [2,] 206.3054 241.976 241.5821 198.7039 243.2236 239.3933 239.69 [3,] 204.1035 244.3271 244.2875 218.5334 243.7765 239.1547 252.0341 [4,] 222.5313 242.494 234.2466 229.7297 242.8088 247.4714 242.9732 [5,] 228.2269 242.7452 222.5183 233.2577 242.0669 242.7832 242.8417 [6,] 237.058 241.8235 235.3313 242.1377 241.7233 241.8443 241.8192 b6164 v1372 v5244 v5640 v6164 bv1372 bv5244 [1,] 244.097 243.0404 242.4219 250.7803 245.2109 243.1929 230.8454 [2,] 245.59 239.6461 240.0976 249.8216 244.076 240.2225 239.4011 [3,] 248.9123 240.3455 241.308 256.1201 241.8166 239.2862 238.6731 [4,] 245.1561 240.3136 246.373 257.4908 243.991 241.2637 247.0656 [5,] 242.3743 241.8402 242.5925 252.1454 239.7479 242.9514 242.6109 [6,] 241.8072 241.3552 244.5711 237.4899 241.7374 241.8847 244.9614 bv5640 bv6164 [1,] 231.3937 241.8475 [2,] 231.5027 239.3111 [3,] 230.2004 239.2619 [4,] 230.8542 231.8769 [5,] 233.1609 236.7501 [6,] 232.2402 241.8176
изменить: данные
library(scales) library(foreach) library(doParallel) library(forecast) library(future.apply) plan(multiprocess) #for future_lapply Macro lt;- structure( list( qtrs = structure( 1:14, .Label = c( "15_Q3", "15_Q4", "16_Q1", "16_Q2", "16_Q3", "16_Q4", "17_Q1", "17_Q2", "17_Q3", "17_Q4", "18_Q1", "18_Q2", "18_Q3", "QQ_New" ), class = "factor" ), y = c( 121.3, 131.1, 142.5, 156.4, 168.7, 176.2, 177, 186.6, 199.6, 208.4, 214, 226.2, 232.5, 233.3 ), c1372 = c( 0.51798059487155, 0.605074600778554, 0.70840580233259, 0.796638389230915, 0.800936365512504, 0.862507422705653, 0.906587776772603, 0.965869599669482, 1.02057681299029, 1.0173665712577, 1.00815541019123, 1.11026857023261, 1.12549360199319, 1.17070543044674 ), c5244 = c( 0.0158288398871533, 0.0186529717846534, 0.0335038479568057, 0.0322124481706554, 0.0473432307176583, 0.0372644166954006, 0.055124227441671, 0.0462947124597511, 0.0595395997947759, 0.079813226336006, 0.0632338684298483, 0.0359582444979424, 0.0399978873936274, 0.0363530147033467 ), c5640 = c( 0.0695411232121069, 0.0711030107194139, 0.0768960904393596, 0.0937721113616879, 0.0912072768529112, 0.0948627915873504, 0.0898598251896699, 0.102519015439631, 0.117307571608132, 0.116512410019832, 0.112621649435311, 0.113373707050245, 0.11920732067264, 0.11385677519257 ), c6164 = c( 0.165253620685311, 0.180939722142955, 0.204839371353829, 0.230388360169478, 0.245455819824873, 0.250222069413121, 0.267517323013963, 0.301455130772129, 0.312527568603722, 0.318684362849784, 0.336297671149745, 0.385321973576628, 0.393392171202544, 0.414026295628249 ), b1372 = c( 0.220276379575007, 0.232259423605283, 0.239015099925248, 0.29722406784095, 0.305759227349267, 0.314812674203001, 0.373507924872403, 0.376216626537958, 0.450679682818151, 0.422160030256414, 0.398670890305128, 0.380896038096525, 0.339513818723946, 0.365265284571949 ), b5244 = c( 0.0256963971001724, 0.0308736893223339, 0.0314727889765328, 0.0342560993718647, 0.0329261690808683, 0.0341169107838618, 0.0500316002161605, 0.057066652393088, 0.0637597978553195, 0.102100656473269, 0.109515398926193, 0.0509080775409312, 0.034576665601428, 0.037353167421955 ), b5640 = c( 0.0610914743954476, 0.0681070468175109, 0.0680584203087885, 0.0737178858316377, 0.0657525044040775, 0.0634389081514569, 0.0655890933419926, 0.0689747904574716, 0.0653176858840394, 0.0683221933318993, 0.0692822163266979, 0.0648739229545749, 0.0613089747918081, 0.0681802570906864 ), b6164 = c( 0.106769764392002, 0.117293493937739, 0.128632140410947, 0.146139699267301, 0.15999997720466, 0.170137316488036, 0.188733545209946, 0.192072924866328, 0.200314760101575, 0.206572493122192, 0.21531555211795, 0.187877279779437, 0.161952291803993, 0.160944253061549 ), v1372 = c( 0.00268999015293817, 0.00312395322452212, 0.00339511453015627, 0.00345686458302532, 0.00342490795325169, 0.0036875222492476, 0.00361618758896395, 0.00355297766248592, 0.00386182842589497, 0.00356454140879668, 0.00347191673410727, 0.00363595803623375, 0.00374222181870868, 0.00371078757415556 ), v5244 = c( 0.000480051602474059, 0.00042588395300854, 0.0005605459198973, 0.000529571165782351, 0.00057240403833901, 0.000468179333138233, 0.000653241119295764, 0.000455570432040571, 0.000535395675184177, 0.00138501873189088, 0.00114060122318986, 0.000320532455933637, 0.000333175133801828, 0.000314970929257286 ), v5640 = c( 0.000839152227642805, 0.000878653169087127, 0.00086250329626335, 0.000928749230480325, 0.000952705037621405, 0.0009145284719627, 0.000862662166602764, 0.000861675351344781, 0.000900555099811469, 0.000846321708899047, 0.000869990227889332, 0.000889602926022706, 0.000847332392691765, 0.000745645512078392 ), v6164 = c( 0.00174116886286925, 0.00190736857470478, 0.00204206516831707, 0.00208434471661794, 0.0022434016778137, 0.00215767033473045, 0.00216675412062837, 0.00211218329813293, 0.00222445645154173, 0.00210022505915819, 0.00196775099859493, 0.00205851514065652, 0.00187858647947073, 0.00198038712502613 ), bv1372 = c( 0.00142360941776777, 0.00151188642851632, 0.00157840305106086, 0.00168297006976765, 0.00157809381382463, 0.00180299614944991, 0.00285754565464732, 0.0026777621396315, 0.00314015380649578, 0.00293231409618566, 0.00290686161843522, 0.00248890293023165, 0.00168251123284542, 0.00179265933772828 ), bv5244 = c( 0.000582722401914161, 0.000711777965499918, 0.000761910243648493, 0.000805854835145839, 0.000736857013245957, 0.000833892120648163, 0.0013602408759186, 0.0015050207801102, 0.0016936381650882, 0.00295309680744017, 0.0031773319850428, 0.00106962198904438, 0.000593441969063344, 0.000574791244792 ), bv5640 = c( 0.00115351432401665, 0.00132428243672085, 0.00136224787475921, 0.00141606633583978, 0.00116049625522213, 0.000858609082150378, 0.000908098663997447, 0.000935982449156028, 0.000899912473850066, 0.000835053614508394, 0.000872837946479594, 0.000833516238462063, 0.000726891442062557, 0.000774037355521608 ), bv6164 = c( 0.000926271545004555, 0.00105864530300842, 0.00109611375444535, 0.00117219207771791, 0.00122508269987305, 0.00135585463133827, 0.00195926581029822, 0.00187620455518874, 0.00206572868014085, 0.00213169451258196, 0.00205259028597028, 0.00136013066654879, 0.000919533667669498, 0.0010609844820593 ), s1 = c(1L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 1L, 0L), s2 = c(0L, 1L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 1L), s3 = c(0L, 0L, 1L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 1L, 0L, 0L, 0L), date = structure( c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = "2018-09-30", class = "factor" ) ), class = "data.frame", row.names = c(NA,-14L) ) # Loads variables vars_macro lt;- c("c1372", "c5244", "c5640", "c6164", "b1372", "b5244", "b5640", "b6164", "v1372", "v5244", "v5640", "v6164", "bv1372", "bv5244", "bv5640", "bv6164") vars = c(vars_macro) all_outputs lt;- lapply(6:1, function (z) { x1 lt;- ts(Macro[-z, vars], start = c(2016, 3), frequency = 4) y1 lt;- ts(Macro[-z, 'y'], start = c(2016, 3), frequency = 4) t1 lt;- ts(Macro[nrow(Macro)-z 1, vars], start = c(2018, 4), frequency = 4) fits lt;- future_lapply(x1, function(x) auto.arima( y = y1, xreg = x, seasonal = TRUE )) outputs lt;- lapply(vars, function(x) x = forecast(fits[[x]], xreg = t1[, x])$mean) names(outputs) lt;- vars outputs } ) data.table::rbindlist(all_outputs) do.call(rbind, all_outputs)
Комментарии:
1. Я тоже не могу заставить ваш код работать. Вы определили функцию(x)? Проблема с кодом заключается в том, что не все переменные vars принадлежат таблице макросов. Некоторые переменные vars были сгенерированы как комбинации переменных в таблице макросов (поэтому их нельзя найти в макросе).
2. Я отредактировал свой код со всеми данными и пакетами во втором окне. Я запустил его, и он работал в RStudio.
lapply()
Включает в себя анонимную функцию. Переменные, которые вы обновили для vars_macro, все были включены в макрокоманду data.frame.3. Привет @Cole, смотри выше — изначально я не хотел включать весь код и переменные, потому что думал, что их довольно много, но смотри выше. Я думаю, что включил все.
4. Я заменил переменную vars на vars_macro, так как вы вызываете переменные явно только в макросе. Когда я запустил этот код, он не вернул ошибок, но я попытался вызвать вывод через выходы и ничего не получил. Есть идеи?
5. Вы должны сделать
all_outputs
или сделать линиюdo.call(rbind, all_outputs)
. См.раздел Редактирование с выводом данных. Я не собираюсь включать остальные ваши данные — для меня это уже 22 секунды с 16 столбцами, не говоря уже о 120 переменных. Вам следует выполнить подмножество из 16 переменных, которые я использовал, и посмотреть, есть ли какая-либо экономия времени на вашей машине. Я ожидаю, что они будут, но опять же, ваше слабое звено-этоauto.arima
функция. С этим особо ничего не поделаешь.