如何捕获 R 中非标准函数的输出?

How to capture output from non-standard function in R?

我正在尝试从 GitHub.

获得的 ur.ls 函数中捕获输出的某些部分

我使用的代码是:

my_test <- ur.ls(y=mydf$x, model = "break", breaks = 2, lags = maxlag, method = "GTOS",pn = 0.1, print.results = "print" )
print(my_test)

给出以下输出:

[[1]]
[[1]]$`t-stat`
[1] -5.529869

[[1]]$`First break`
[1] 35

[[1]]$`Second break`
[1] 55

[[1]]$Runtime
Time difference of 0.07702468 mins


[[2]]

Call:
lm(formula = y.diff ~ 0 + lagmatrix(S.tilde, 1)[, -1] + datmat[, 
    2:(slag + 2)] + DTt.diff)

Residuals:
     Min       1Q   Median       3Q      Max 
-15.1301  -1.7312   0.0684   1.8045  10.3472 

Coefficients: (1 not defined because of singularities)
                                       Estimate Std. Error t value Pr(>|t|)    
lagmatrix(S.tilde, 1)[, -1]            -0.23512    0.04252  -5.530 5.71e-07 ***
datmat[, 2:(slag + 2)]NoLags                 NA         NA      NA       NA    
datmat[, 2:(slag + 2)]S.tilde.diff.l1   0.21258    0.09923   2.142 0.035797 *  
datmat[, 2:(slag + 2)]S.tilde.diff.l2   0.29349    0.10449   2.809 0.006509 ** 
datmat[, 2:(slag + 2)]S.tilde.diff.l3   0.45070    0.11026   4.088 0.000119 ***
datmat[, 2:(slag + 2)]S.tilde.diff.l4   0.21321    0.13451   1.585 0.117662    
datmat[, 2:(slag + 2)]S.tilde.diff.l5  -0.10950    0.11104  -0.986 0.327638    
datmat[, 2:(slag + 2)]S.tilde.diff.l6  -0.26316    0.11047  -2.382 0.020050 *  
DTt.diff1                              -3.48648    1.16726  -2.987 0.003934 ** 
DTt.diff2                             -11.06934    5.14490  -2.152 0.035044 *  
DTt.diff3                              11.16147    2.60165   4.290 5.87e-05 ***
DTt.diff4                               9.94658    5.91986   1.680 0.097575 .  
DTt.diff5                             -11.26274    2.10680  -5.346 1.17e-06 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 4.34 on 67 degrees of freedom
  (7 observations deleted due to missingness)
Multiple R-squared:  0.6446,    Adjusted R-squared:  0.5809 
F-statistic: 10.13 on 12 and 67 DF,  p-value: 5.789e-11

我正在尝试从输出中捕获以下信息:

  1. t-统计,
  2. 断点
  3. lagmatrix(S.tilde, 1)[ -1]
  4. 的估计值
  5. 滞后数
  6. 休息次数

当然,这可以使用以下方法手动完成:

tstat<- c(-5.529869)
break1<-c(35)
break2<-c(55)
estimate<-c(-0.23512)
nlag<- c(6)
nbreak<- c(2)

但问题是我需要做几个分数,所以这不是很实用。

我首先尝试使用 broom 包使用 tidy 捕获系数,这通常工作得很好,但在这种情况下,tidy 包根本无法识别输出。那就是当我尝试应用它时,我得到:

tidy(my_test)
Error: No tidy method recognized for this list.

在那之后,我设法找到了一种可行的方法,但仅用于捕获 t 统计数据:

tstat<- c(as.numeric(substring((capture.output(print(my_test))[3]),5)))

原则上我可以将其应用于我需要捕获的其他内容,但问题是打印输出中的所有内容都会向上或向下移动,具体取决于我使用的是 1 次还是 2 次中断,此外,滞后次数不断变化。唯一没有改变位置的两件事是开始时的 t-stat 和第一次中断。当从两次中断切换到一次中断时,或根据滞后次数,其他所有内容的位置都会发生变化。

因此,我正在寻找一种方法,即使位置发生变化,也可以动态捕获上述测试的输出。它不一定需要通过 capture.output 函数来完成 - 这只是我设法完成的唯一事情。


dput for my_test:

list(list(`t-stat` = -5.52986939989444, `First break` = 35, `Second break` = 55, 
    Runtime = structure(0.243574384848277, class = "difftime", units = "mins")), 
    structure(list(call = lm(formula = y.diff ~ 0 + lagmatrix(S.tilde, 
        1)[, -1] + datmat[, 2:(slag + 2)] + DTt.diff), terms = y.diff ~ 
        0 + lagmatrix(S.tilde, 1)[, -1] + datmat[, 2:(slag + 
            2)] + DTt.diff, residuals = c(`8` = 0.872355573916085, 
    `9` = -0.697717191898609, `10` = -1.2862848943206, `11` = 0.320933377794575, 
    `12` = -2.40645214393101, `13` = 2.39038766132493, `14` = 1.153249843184, 
    `15` = -0.39800522090757, `16` = -0.217625238730097, `17` = -2.24998945123775, 
    `18` = -1.86235465631137, `19` = 1.52748936990644, `20` = 0.722105553225127, 
    `21` = 1.6896236096191, `22` = 1.21756654083507, `23` = -2.2737081032416, 
    `24` = -0.0555189856184707, `25` = -1.32745447769992, `26` = -2.69191851601456, 
    `27` = 0.450323241676394, `28` = -0.619946732648159, `29` = 0.0684171523027832, 
    `30` = 1.36501867693609, `31` = 7.01636358940376, `32` = 7.45606136222332, 
    `33` = -0.0603699574229863, `34` = -7.06134338379436, `35` = -3.04120659857061, 
    `36` = 1.87843876200867e-16, `37` = -1.56067141954618, `38` = -3.98995837788732, 
    `39` = -2.64034463279261, `40` = 2.46318877060907, `41` = -0.0946579433877879, 
    `42` = -0.00627968340149751, `43` = -1.12994022351662, `44` = 3.87981944634356, 
    `45` = 3.3557912879781, `46` = 9.63244802758174, `47` = 5.24100528509744, 
    `48` = -1.60009293145095, `49` = -5.2376819302277, `50` = -9.38754075959704, 
    `51` = 10.3471769906691, `52` = -12.1568213639348, `53` = 0.85133551132459, 
    `54` = 2.24952813266479, `55` = -0.216304186525884, `56` = -3.97245045306514e-16, 
    `57` = 2.71150736214547, `58` = -3.66810792780268, `59` = 0.358219488791779, 
    `60` = 1.56109333234247, `61` = -0.753216017616136, `62` = -15.1300849652179, 
    `63` = 4.61095601773964, `64` = 1.91940902601647, `65` = -3.09550436133278, 
    `66` = 2.49107250967601, `67` = 3.82885377877594, `68` = 0.787299241035634, 
    `69` = -5.65977223850224, `70` = -4.46105368830907, `71` = -2.00896053907376, 
    `72` = -0.983959541709144, `73` = 0.385499753844272, `74` = 1.38470803882371, 
    `75` = 0.341275340812954, `76` = 0.228639263368348, `77` = -4.17228901167752, 
    `78` = 1.63431085026858, `79` = 5.33398073977219, `80` = 4.03952947226404, 
    `81` = 3.63845224619818, `82` = 0.567342464096198, `83` = 3.13210340972586, 
    `84` = -0.906695505369889, `85` = 4.99623519164391, `86` = -3.1108437307305
    ), coefficients = structure(c(-0.23511569792016, 0.21258442578596, 
    0.293489227268745, 0.450696031637051, 0.213211609782706, 
    -0.109499991050521, -0.263162801329296, -3.48647692130263, 
    -11.0693444630996, 11.1614685510626, 9.94657879595707, -11.2627444589128, 
    0.0425174051894693, 0.0992264489202736, 0.104487280919139, 
    0.110259125401975, 0.134513214269294, 0.111044998102637, 
    0.110466070195529, 1.16726401701977, 5.1449023295093, 2.60164949654566, 
    5.91986223733132, 2.10680207458884, -5.52986939989444, 2.14241694728758, 
    2.80885122750846, 4.08760753356181, 1.5850607015892, -0.986086657854799, 
    -2.38229531351562, -2.98687946382877, -2.15151692960425, 
    4.29015075469706, 1.68020443672368, -5.34589584601145, 5.7066830928081e-07, 
    0.0357972680393423, 0.00650896518048846, 0.000118991853434715, 
    0.117661531503541, 0.327638306451416, 0.020050387349118, 
    0.00393444251065558, 0.0350440626131117, 5.87177198313913e-05, 
    0.0975747763082409, 1.16724779705709e-06), .Dim = c(12L, 
    4L), .Dimnames = list(c("lagmatrix(S.tilde, 1)[, -1]", "datmat[, 2:(slag + 2)]S.tilde.diff.l1", 
    "datmat[, 2:(slag + 2)]S.tilde.diff.l2", "datmat[, 2:(slag + 2)]S.tilde.diff.l3", 
    "datmat[, 2:(slag + 2)]S.tilde.diff.l4", "datmat[, 2:(slag + 2)]S.tilde.diff.l5", 
    "datmat[, 2:(slag + 2)]S.tilde.diff.l6", "DTt.diff1", "DTt.diff2", 
    "DTt.diff3", "DTt.diff4", "DTt.diff5"), c("Estimate", "Std. Error", 
    "t value", "Pr(>|t|)"))), aliased = c(`lagmatrix(S.tilde, 1)[, -1]` = FALSE, 
    `datmat[, 2:(slag + 2)]NoLags` = TRUE, `datmat[, 2:(slag + 2)]S.tilde.diff.l1` = FALSE, 
    `datmat[, 2:(slag + 2)]S.tilde.diff.l2` = FALSE, `datmat[, 2:(slag + 2)]S.tilde.diff.l3` = FALSE, 
    `datmat[, 2:(slag + 2)]S.tilde.diff.l4` = FALSE, `datmat[, 2:(slag + 2)]S.tilde.diff.l5` = FALSE, 
    `datmat[, 2:(slag + 2)]S.tilde.diff.l6` = FALSE, DTt.diff1 = FALSE, 
    DTt.diff2 = FALSE, DTt.diff3 = FALSE, DTt.diff4 = FALSE, 
    DTt.diff5 = FALSE), sigma = 4.34022853989968, df = c(12L, 
    67L, 13L), r.squared = 0.644573890970572, adj.r.squared = 0.580915483383212, 
        fstatistic = c(value = 10.1255107596904, numdf = 12, 
        dendf = 67), cov.unscaled = structure(c(9.59639922665142e-05, 
        2.20580058347817e-05, -1.86765939916722e-05, -6.97933563296721e-05, 
        -9.18368279866152e-05, -2.74027448794235e-05, -1.08445650048574e-06, 
        0.00166049760804861, 0.00505585030558691, -0.00497849874276068, 
        -0.00336957248783249, 0.00332058543538181, 2.20580058347817e-05, 
        0.000522672561463745, -0.000170134234480263, -0.000136299258433012, 
        -0.000156683869192449, 3.20741691986199e-05, 0.000109417994668808, 
        -0.000340545121006471, 0.000835502882418284, -0.00034262796834208, 
        -0.00311928203169194, 0.00137747915213809, -1.86765939916722e-05, 
        -0.000170134234480263, 0.000579564343400617, -0.000118662022760285, 
        -0.000113907761908382, -7.56369903448711e-05, -1.67418563277836e-05, 
        -0.000673822989020871, 0.00199348470539279, 0.00202854373119897, 
        -0.00443981226091342, -0.00134400501096897, -6.97933563296721e-05, 
        -0.000136299258433012, -0.000118662022760285, 0.000645362742765626, 
        -5.98565469825177e-05, -3.8229997405084e-05, -0.000146569197018866, 
        -0.00144027001250464, -0.00434693403705934, 0.004657498011182, 
        0.00200435070362651, -0.00352774302397917, -9.18368279866152e-05, 
        -0.000156683869192449, -0.000113907761908382, -5.98565469825177e-05, 
        0.000960516222555618, -0.000232668650784361, 2.61183442453487e-05, 
        -0.00216702563816879, -0.010485401200229, 0.00424329320154643, 
        0.0246863500668702, -0.00150724670465891, -2.74027448794235e-05, 
        3.20741691986199e-05, -7.56369903448711e-05, -3.8229997405084e-05, 
        -0.000232668650784361, 0.000654595183149194, -0.000227073038814052, 
        -0.00050839722994379, -0.00414193034888211, 0.0012164182953312, 
        -0.0101302132850535, -0.000174392386630977, -1.08445650048574e-06, 
        0.000109417994668808, -1.67418563277836e-05, -0.000146569197018866, 
        2.61183442453487e-05, -0.000227073038814052, 0.000647787572328266, 
        -0.000832648885600449, 0.00184942667154017, -0.00111837128659685, 
        0.0101221919879007, 0.00341776474899047, 0.00166049760804861, 
        -0.000340545121006471, -0.000673822989020871, -0.00144027001250464, 
        -0.00216702563816879, -0.00050839722994379, -0.000832648885600449, 
        0.0723290896245352, 0.099047414012332, -0.126717608042948, 
        -0.0879683442319499, 0.0467983613397516, 0.00505585030558691, 
        0.000835502882418284, 0.00199348470539279, -0.00434693403705934, 
        -0.010485401200229, -0.00414193034888211, 0.00184942667154017, 
        0.099047414012332, 1.40517065730678, -0.317384545601921, 
        -0.294134124076671, 0.205736990719251, -0.00497849874276068, 
        -0.00034262796834208, 0.00202854373119897, 0.004657498011182, 
        0.00424329320154643, 0.0012164182953312, -0.00111837128659685, 
        -0.126717608042948, -0.317384545601921, 0.359312541483163, 
        0.15130744081174, -0.232250025264234, -0.00336957248783249, 
        -0.00311928203169194, -0.00443981226091342, 0.00200435070362651, 
        0.0246863500668702, -0.0101302132850535, 0.0101221919879007, 
        -0.0879683442319499, -0.294134124076671, 0.15130744081174, 
        1.86036432914864, -0.0614605342855884, 0.00332058543538181, 
        0.00137747915213809, -0.00134400501096897, -0.00352774302397917, 
        -0.00150724670465891, -0.000174392386630977, 0.00341776474899047, 
        0.0467983613397516, 0.205736990719251, -0.232250025264234, 
        -0.0614605342855884, 0.235625493888645), .Dim = c(12L, 
        12L), .Dimnames = list(c("lagmatrix(S.tilde, 1)[, -1]", 
        "datmat[, 2:(slag + 2)]S.tilde.diff.l1", "datmat[, 2:(slag + 2)]S.tilde.diff.l2", 
        "datmat[, 2:(slag + 2)]S.tilde.diff.l3", "datmat[, 2:(slag + 2)]S.tilde.diff.l4", 
        "datmat[, 2:(slag + 2)]S.tilde.diff.l5", "datmat[, 2:(slag + 2)]S.tilde.diff.l6", 
        "DTt.diff1", "DTt.diff2", "DTt.diff3", "DTt.diff4", "DTt.diff5"
        ), c("lagmatrix(S.tilde, 1)[, -1]", "datmat[, 2:(slag + 2)]S.tilde.diff.l1", 
        "datmat[, 2:(slag + 2)]S.tilde.diff.l2", "datmat[, 2:(slag + 2)]S.tilde.diff.l3", 
        "datmat[, 2:(slag + 2)]S.tilde.diff.l4", "datmat[, 2:(slag + 2)]S.tilde.diff.l5", 
        "datmat[, 2:(slag + 2)]S.tilde.diff.l6", "DTt.diff1", 
        "DTt.diff2", "DTt.diff3", "DTt.diff4", "DTt.diff5"))), 
        na.action = structure(1:7, .Names = c("1", "2", "3", 
        "4", "5", "6", "7"), class = "omit")), class = "summary.lm"))

这主要是一个子集问题。

tstat = my_test[[1L]][['t-stat']]

## breaks ##
break_names = endsWith(names(my_test[[1L]]), 'break')
nbreak = sum(break_names)
for (i in seq_len(nbreak)) { ## note, I would assign breaks to a list: breaks = my_test[[1L]][break_names]
  assign(paste0('break', i), my_test[[1L]][[i + 1L]])
}

estimate = my_test[[2L]][['coefficients']][1L, 1L]

txt = row.names(my_test[[2L]][['coefficients']])
nlag = max(as.integer(regmatches(txt, regexpr("\d*$", txt))), na.rm = TRUE)

唯一不确定的部分是nlag。它现在很脆弱,因为我不确定它会遵循的规则。但是对于这个数据集,它符合 OP 要求。