提取 rtrend 输出以使用 data.table 列出

问题描述 投票:0回答:1

我有一些代码用于将回归输出提取到一个列表中,我可以将其从控制台复制出来并粘贴到某个位置,该列表可以很好地处理 33 个气象站的 1052 条记录,每个气象站都有 18-33 年的数据(按站 ID)。在没有真正理解如何实现的情况下,我让它发挥了作用。现在尝试使用 rtrends::mkTrend 出于相同目的对其进行修改,它输出七个参数的列表。

数据样本:

 x   y grp
1990 188 CDO
1991 164 CDO
1992 159 CDO
1993 219 CDO
1994 202 CDO
1995 249 CDO
1996 243 CDO
1997 220 CDO
1998 186 CDO
1999 187 CDO
1990 188 Key
1991 207 Key
1992 211 Key
1993 183 Key
1994 171 Key
1995 215 Key
1996 184 Key
1997 202 Key
1998 186 Key
1999 168 Key

可恶的代码:

dat_sample[, list(p.value=mkTrend(y)[2],
     p_val_corr=mkTrend(y)[4],
     tau=mkTrend(y)[5],
     Sens=mkTrend(y)[7],
     by=format(grp,justify = "r"))] 

所需输出:

       p.value   p_val_corr         tau   Sens   by
 1:  0.5915050     0.591505   0.1555556      4  CDO
 2:  0.3710934    0.3710934  -0.2444444   -1.8  Key

实际产量

      p.value p_val_corr        tau Sens  by
 1: 0.3981742  0.3981742 -0.1421053 -0.6 CDO
 2: 0.3981742  0.3981742 -0.1421053 -0.6 CDO
 3: 0.3981742  0.3981742 -0.1421053 -0.6 CDO
 4: 0.3981742  0.3981742 -0.1421053 -0.6 CDO
 5: 0.3981742  0.3981742 -0.1421053 -0.6 CDO
 6: 0.3981742  0.3981742 -0.1421053 -0.6 CDO
 7: 0.3981742  0.3981742 -0.1421053 -0.6 CDO
 8: 0.3981742  0.3981742 -0.1421053 -0.6 CDO
 9: 0.3981742  0.3981742 -0.1421053 -0.6 CDO
10: 0.3981742  0.3981742 -0.1421053 -0.6 CDO
11: 0.3981742  0.3981742 -0.1421053 -0.6 Key
12: 0.3981742  0.3981742 -0.1421053 -0.6 Key
13: 0.3981742  0.3981742 -0.1421053 -0.6 Key
14: 0.3981742  0.3981742 -0.1421053 -0.6 Key
15: 0.3981742  0.3981742 -0.1421053 -0.6 Key
16: 0.3981742  0.3981742 -0.1421053 -0.6 Key
17: 0.3981742  0.3981742 -0.1421053 -0.6 Key
18: 0.3981742  0.3981742 -0.1421053 -0.6 Key
19: 0.3981742  0.3981742 -0.1421053 -0.6 Key
20: 0.3981742  0.3981742 -0.1421053 -0.6 Key
r data.table
1个回答
0
投票

前面:这里使用

as.list
而不是
list

我没有安装 fftw,所以无法尝试

rtrend::mkTrend(.)
,但我可以使用
mkTrend_r
(和
slope_sen_r
)。

本身,

mkTrend_r
返回一个向量,并且
data.table
高兴地假设它应该是“长”格式:

dat_sample[, mkTrend_r(y), by="grp"]
# Warning in lm(y ~ I(1:n))$resid :
#   partial match of 'resid' to 'residuals'
# Warning in lm(y ~ I(1:n))$resid :
#   partial match of 'resid' to 'residuals'
#        grp          V1
#     <char>       <num>
#  1:    CDO   0.5366563
#  2:    CDO   0.5915050
#  3:    CDO   0.5366563
#  4:    CDO   0.5915050
#  5:    CDO   3.1428571
#  6:    CDO 184.4142857
#  7:    Key  -0.8944272
#  8:    Key   0.3710934
#  9:    Key  -0.8944272
# 10:    Key   0.3710934
# 11:    Key  -1.8000000
# 12:    Key 201.4000000

我们可以用

as.list
来解决这个问题:

dat_sample[, as.list(mkTrend_r(y)), by="grp"]
# Warning in lm(y ~ I(1:n))$resid :
#   partial match of 'resid' to 'residuals'
# Warning in lm(y ~ I(1:n))$resid :
#   partial match of 'resid' to 'residuals'
#       grp         z0     pval0          z      pval       slp intercept
#    <char>      <num>     <num>      <num>     <num>     <num>     <num>
# 1:    CDO  0.5366563 0.5915050  0.5366563 0.5915050  3.142857  184.4143
# 2:    Key -0.8944272 0.3710934 -0.8944272 0.3710934 -1.800000  201.4000

由于您只需要几列,我们可以进行子集化:

dat_sample[, as.list(mkTrend_r(y)[c("pval0", "pval", "z", "slp")]), by="grp"]
# Warning in lm(y ~ I(1:n))$resid :
#   partial match of 'resid' to 'residuals'
# Warning in lm(y ~ I(1:n))$resid :
#   partial match of 'resid' to 'residuals'
#       grp     pval0      pval          z       slp
#    <char>     <num>     <num>      <num>     <num>
# 1:    CDO 0.5915050 0.5915050  0.5366563  3.142857
# 2:    Key 0.3710934 0.3710934 -0.8944272 -1.800000

您可以通过在

c("p.value", "p_val_corr", ...) :=
左侧添加
as.list
来重命名,也可以在完整表达式后使用
setnames

我不知道哪个值是

tau
,是
z
还是
z0

顺便说一句:我认为该包可能需要一些注意:警告是因为代码中的缩写列名(草率),并且文档说返回的值名称是

Z
Z0
,而不是
z
 z0
。当然是小事,但让我想知道......

© www.soinside.com 2019 - 2024. All rights reserved.