我使用
g <- lapply(split(bbm, list(bbm$variable, bbm$ticker)), function(x) testx(x$value))
分别表示str(g)
和str(g[g != "NULL"] )
,其中testx
定义为
library(tseries) # for adf.test
##
testx <- function (x) {
return(tryCatch(adf.test(x), error=function(e) NULL))
}
得到由两个变量ticker
和variable
分组的增广Dickey-Fuller检验的结果。
我如何提取p值并将它们作为列添加到我的初始data.frame中?
下面是我的数据样本:
ticker variable value
1 1002Z AV Equity BS_CUSTOMER_DEPOSITS 29898.0
2 1002Z AV Equity BS_CUSTOMER_DEPOSITS 31302.0
3 1002Z AV Equity BS_CUSTOMER_DEPOSITS 29127.0
4 1002Z AV Equity BS_CUSTOMER_DEPOSITS 24056.0
5 1002Z AV Equity BS_CUSTOMER_DEPOSITS 22080.0
6 1002Z AV Equity BS_CUSTOMER_DEPOSITS 22585.0
7 1002Z AV Equity BS_CUSTOMER_DEPOSITS 22674.0
8 1002Z AV Equity BS_CUSTOMER_DEPOSITS 21733.0
9 1002Z AV Equity BS_CUSTOMER_DEPOSITS 22016.0
10 1002Z AV Equity BS_CUSTOMER_DEPOSITS 21999.0
11 1002Z AV Equity BS_CUSTOMER_DEPOSITS 22013.0
12 1002Z AV Equity BS_CUSTOMER_DEPOSITS 21135.0
13 1002Z AV Equity BS_TOT_LOAN 28476.0
14 1002Z AV Equity BS_TOT_LOAN 29446.0
15 1002Z AV Equity BS_TOT_LOAN 29273.0
16 1002Z AV Equity BS_TOT_LOAN 27579.0
17 1002Z AV Equity BS_TOT_LOAN 20769.0
18 1002Z AV Equity BS_TOT_LOAN 21370.0
19 1002Z AV Equity BS_TOT_LOAN 22306.0
20 1002Z AV Equity BS_TOT_LOAN 21013.0
21 1002Z AV Equity BS_TOT_LOAN 21810.0
22 1002Z AV Equity BS_TIER1_CAP_RATIO 6.5
23 1002Z AV Equity BS_TIER1_CAP_RATIO 6.2
24 1002Z AV Equity BS_TIER1_CAP_RATIO 7.9
25 1002Z AV Equity BS_TIER1_CAP_RATIO 9.2
26 1002Z AV Equity BS_TIER1_CAP_RATIO 8.5
27 1002Z AV Equity BS_TIER1_CAP_RATIO 6.6
28 1002Z AV Equity BS_TIER1_CAP_RATIO 9.6
29 1002Z AV Equity BS_TOT_CAP_TO_RISK_BASE_CAP 11.5
30 1002Z AV Equity BS_TOT_CAP_TO_RISK_BASE_CAP 10.9
> dput(head(select(bbm, ticker, variable, value), 30))
structure(list(ticker = c("1002Z AV Equity", "1002Z AV Equity",
"1002Z AV Equity", "1002Z AV Equity", "1002Z AV Equity", "1002Z AV Equity",
"1002Z AV Equity", "1002Z AV Equity", "1002Z AV Equity", "1002Z AV Equity",
"1002Z AV Equity", "1002Z AV Equity", "1002Z AV Equity", "1002Z AV Equity",
"1002Z AV Equity", "1002Z AV Equity", "1002Z AV Equity", "1002Z AV Equity",
"1002Z AV Equity", "1002Z AV Equity", "1002Z AV Equity", "1002Z AV Equity",
"1002Z AV Equity", "1002Z AV Equity", "1002Z AV Equity", "1002Z AV Equity",
"1002Z AV Equity", "1002Z AV Equity", "1002Z AV Equity", "1002Z AV Equity"
), variable = structure(c(4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L,
4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 8L, 8L, 8L, 8L,
8L, 8L, 8L, 9L, 9L), .Label = c("PX_LAST", "PE_RATIO", "VOL_MEAN",
"BS_CUSTOMER_DEPOSITS", "BS_TOT_LOAN", "*", "RN366", "BS_TIER1_CAP_RATIO",
"BS_TOT_CAP_TO_RISK_BASE_CAP", "RETURN_COM_EQY", "BS_LEV_RATIO_TO_TANG_CAP",
"NPLS_TO_TOTAL_LOANS"), class = "factor"), value = c(29898, 31302,
29127, 24056, 22080, 22585, 22674, 21733, 22016, 21999, 22013,
21135, 28476, 29446, 29273, 27579, 20769, 21370, 22306, 21013,
21810, 6.5, 6.2, 7.9, 9.2, 8.5, 6.6, 9.6, 11.5, 10.9)), .Names = c("ticker",
"variable", "value"), row.names = c(NA, 30L), class = "data.frame")
可以使用data.table
。我们将data.frame转换为data。表' (setDT(bbm)
)。按"ticker"、"variable"分组,对"value"列应用testx
函数。我们得到5个新列的汇总输出,从中我们可以选择"p值"(testx(value)$p.value
)并分配(:=
)在原始数据集中创建一个新列("pval")。
library(data.table)
setDT(bbm)[,pval := testx(value)$p.value , by = .(ticker, variable)]