Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 对财务数据运行滞后回归_R_Time Series_Regression_Finance - Fatal编程技术网

R 对财务数据运行滞后回归

R 对财务数据运行滞后回归,r,time-series,regression,finance,R,Time Series,Regression,Finance,我正在尝试为我的数据框架中的30项资产中的每一项运行滞后回归 我的桌子看起来像这样: date rx1 rx2 rx3 1930-01-31 0 0 0 1930-02-28 0 0 -0.3 1930-03-31 0 0 -0.1 .... -0.1 ... 1975-02-28 -0.4 -0.2 ... 2016-12-31

我正在尝试为我的数据框架中的30项资产中的每一项运行滞后回归

我的桌子看起来像这样:

 date          rx1   rx2   rx3  
    1930-01-31  0     0     0
    1930-02-28  0     0    -0.3
    1930-03-31  0     0    -0.1
    ....              -0.1  ...
    1975-02-28  -0.4  -0.2  ...
    2016-12-31  -0.03  ...  ...
然后我尝试用这行代码运行滞后回归(dataframe:Rx3.df):


有人能解决这个问题吗?谢谢

对于这么长的回答,我事先表示歉意。似乎出于某种原因(不知道为什么?)
dyn$lm
没有省略
NA
s。例如,如果您键入
summary(model)
,您将收到以下警告消息:

Warning message:
In summary.lm(lm(rx1 ~ lag(rx1, 1), data = df, model = T)) :
  essentially perfect fit: summary may be unreliable
此外,如果您键入
nobs(model)
,您将得到与
nrow(Rx3.df)
相同的结果,这不应该发生,因为您将在每个延迟中至少删除一个观察值

我重新创建了部分数据,如下所示:

> df<- data.frame(rx1 = runif(1000, 1, 100))
> head(df, 5)
       rx1
1 56.63239
2 89.99562
3 37.35498
4  7.47771
5 92.77819
接下来的两段代码将创建滞后:

> df[, paste0("lag1_", names(df)[like(names(df), "^rx")]) := shift(.SD), .SDcols = like(names(df), "^rx")]
> df[, paste0("lag2_", names(df)[like(names(df), "^rx")]) := shift(.SD, 2), .SDcols = like(names(df), "^rx")]
> head(df, 5)
         date       rx1         rx2 rx3  lag1_rx1    lag1_rx2 lag1_rx3  lag2_rx1   lag2_rx2
1: 1989-01-16  9.642232 -1.14117351   0        NA          NA       NA        NA         NA
2: 1964-05-10 55.946293  1.21938225   1  9.642232 -1.14117351        0        NA         NA
3: 1911-11-24  8.609234 -0.77489439   1 55.946293  1.21938225        1  9.642232 -1.1411735
4: 1914-09-29 57.253969  0.02277709   0  8.609234 -0.77489439        1 55.946293  1.2193823
5: 1902-08-09 69.454322 -0.10850359   1 57.253969  0.02277709        0  8.609234 -0.7748944
   lag2_rx3
1:       NA
2:       NA
3:        0
4:        1
5:        1
最后是结果:

> formula<- paste0(paste0("rx", 1:3),"~", paste0("lag1_rx", 1:3), "+", paste0("lag2_rx", 1:3))
> results<- lapply(formula, function(x) lm(x, data=df))
> names(results)<- paste0("rx", 1:3)

>公式结果名称(结果)看起来您的时间序列一点也没有滞后。这也是为什么第一个回归器的系数为1的原因

要解决您的问题,您可以使用
dplyr
软件包的
lag
/
lead
功能(取决于数据格式):


您是否查看了第三个向量是否包含NAs(例如,lag(Rx3.df$rx1,2)))我将所有NAs替换为0。例如,请参见:一如既往,将工作分解为步骤有助于我们了解问题所在。我不知道
lm
如何解释
Rx3.df$rx1~lag(Rx3.df$rx1,1)+lag(Rx3.df$rx1,2)
,或者这是否是正确的语法。Yannis使用的中间
df_lag
数据帧意味着我们不需要知道,我们可以通过查看
lm
是否使用正确的数据来判断。非常感谢您的详细解释!然而,我总共有30项资产。我是否需要逐个手动滞后变量?有捷径吗?我在考虑为你创造一个loop@Celia有更简单的方法,但我现在不在电脑上,也许我可以稍后再跟进。我确信这已经在其他地方得到了回答。好吧,我有一个完整的解决方案给你,在这里输入太大了,所以我正在编辑我的原始答案。你的dyn代码的问题是:(1)dyn作用于时间序列,而你没有给它一个时间序列。(2) lm的na.action参数告诉它如何处理na值,因此,如果您想要不同的东西,请使用它。那真的与戴恩无关。(3) 在base中,R lag(x,-1)用于滞后一系列,而不是滞后(x,1),dyn不重新定义滞后,但试图与R的其余部分保持一致。
> summary(dyn$lm(rx1~lag(rx1, 1) + lag(rx1, 2), data=df))

Call:
lm(formula = dyn(rx1 ~ lag(rx1, 1) + lag(rx1, 2)), data = df)

Residuals:
       Min         1Q     Median         3Q        Max 
-3.982e-13 -5.400e-16  3.600e-16  1.230e-15  1.211e-14 

Coefficients: (1 not defined because of singularities)
             Estimate Std. Error   t value Pr(>|t|)    
(Intercept) 2.876e-14  8.219e-16 3.499e+01   <2e-16 ***
lag(rx1, 1) 1.000e+00  1.424e-17 7.024e+16   <2e-16 ***
lag(rx1, 2)        NA         NA        NA       NA    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 1.275e-14 on 998 degrees of freedom
Multiple R-squared:      1, Adjusted R-squared:      1 
F-statistic: 4.934e+33 on 1 and 998 DF,  p-value: < 2.2e-16

Warning message:
In summary.lm(dyn$lm(rx1 ~ lag(rx1, 1) + lag(rx1, 2), data = df)) :
  essentially perfect fit: summary may be unreliable
> library(dplyr)
> df_lag<- mutate(df, lag1_rx1 = lag(rx1), lag2_rx1 = lag(rx1, 2))
> head(df_lag, 5)
       rx1 lag1_rx1 lag2_rx1
1 56.63239       NA       NA
2 89.99562 56.63239       NA
3 37.35498 89.99562 56.63239
4  7.47771 37.35498 89.99562
5 92.77819  7.47771 37.35498
> summary(dyn$lm(rx1~lag1_rx1+lag2_rx1, data=df_lag))

Call:
lm(formula = dyn(rx1 ~ lag1_rx1 + lag2_rx1), data = df_lag)

Residuals:
    Min      1Q  Median      3Q     Max 
-50.325 -23.271  -0.471  24.763  50.864 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) 50.84681    2.46790  20.603   <2e-16 ***
lag1_rx1    -0.03664    0.03170  -1.156    0.248    
lag2_rx1     0.02494    0.03170   0.787    0.432    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 28.34 on 995 degrees of freedom
  (2 observations deleted due to missingness)
Multiple R-squared:  0.002033,  Adjusted R-squared:  2.741e-05 
F-statistic: 1.014 on 2 and 995 DF,  p-value: 0.3633
library(data.table)
> df<- data.table(date= sample(seq(as.Date('1900/01/01'), as.Date('2000/01/01'), by="day"), 1000), rx1 = runif(1000, 1, 100), rx2 = rnorm(1000), rx3 = rpois(1000, 1))
> head(df, 5)
         date       rx1         rx2 rx3
1: 1989-01-16  9.642232 -1.14117351   0
2: 1964-05-10 55.946293  1.21938225   1
3: 1911-11-24  8.609234 -0.77489439   1
4: 1914-09-29 57.253969  0.02277709   0
5: 1902-08-09 69.454322 -0.10850359   1
> df[, paste0("lag1_", names(df)[like(names(df), "^rx")]) := shift(.SD), .SDcols = like(names(df), "^rx")]
> df[, paste0("lag2_", names(df)[like(names(df), "^rx")]) := shift(.SD, 2), .SDcols = like(names(df), "^rx")]
> head(df, 5)
         date       rx1         rx2 rx3  lag1_rx1    lag1_rx2 lag1_rx3  lag2_rx1   lag2_rx2
1: 1989-01-16  9.642232 -1.14117351   0        NA          NA       NA        NA         NA
2: 1964-05-10 55.946293  1.21938225   1  9.642232 -1.14117351        0        NA         NA
3: 1911-11-24  8.609234 -0.77489439   1 55.946293  1.21938225        1  9.642232 -1.1411735
4: 1914-09-29 57.253969  0.02277709   0  8.609234 -0.77489439        1 55.946293  1.2193823
5: 1902-08-09 69.454322 -0.10850359   1 57.253969  0.02277709        0  8.609234 -0.7748944
   lag2_rx3
1:       NA
2:       NA
3:        0
4:        1
5:        1
> formula<- paste0(paste0("rx", 1:3),"~", paste0("lag1_rx", 1:3), "+", paste0("lag2_rx", 1:3))
> results<- lapply(formula, function(x) lm(x, data=df))
> names(results)<- paste0("rx", 1:3)
> library(dplyr)
> x <- 1:10
> stats::lag(x)
[1]  1  2  3  4  5  6  7  8  9 10
attr(,"tsp")
[1] 0 9 1
> dplyr::lead(x)
[1]  2  3  4  5  6  7  8  9 10 NA
> dplyr::lag(x)
[1] NA  1  2  3  4  5  6  7  8  9
> library(zoo)
> y <- zoo(1:10)
> stats::lag(y, 1, na.pad = TRUE)
 1  2  3  4  5  6  7  8  9 10 
 2  3  4  5  6  7  8  9 10 NA 
> stats::lag(y, -1,  na.pad = TRUE)
 1  2  3  4  5  6  7  8  9 10 
NA  1  2  3  4  5  6  7  8  9