我有一个包含数百行的数据集,像这样
User Date Value1 Value2
A 2012-01-01 4 3
A 2012-01-02 5 7
A 2012-01-03 6 1
A 2012-01-04 7 4
B 2012-01-01 2 4
B 2012-01-02 3 2
B 2012-01-03 4 9
B 2012-01-04 5 3
由于面板数据有两个索引(User = k,Date = t),因此我难以对R进行回归,其中因变量(值1)仅在时间索引上滞后。回归应如下执行:
Value1(k,t + 1)〜Value2(k,t) 要么 值1(k,t)〜值2(k,t-1)
有什么建议吗?
答案 0 :(得分:0)
对于每个用户,您都可以执行以下操作:
> df <- data.frame(User = c(rep("A", 4), rep("B", 4)),
+ Date = rep(seq.Date(as.Date("2012-01-01"), as.Date("2012-01-04"), by = "day"), 2),
+ Value1 = c(4, 5, 6, 7, 2, 3, 4, 5),
+ Value2 = c(3, 7, 1, 4, 4, 2, 9, 3))
>
> df_A <- df[df$User == "A", c("Value1", "Value2")]
> ts_A <- ts(df_A, start = c(2012, 1, 1), frequency = 365)
> ts_A <- ts.intersect(ts_A, lag(ts_A, -1))
> colnames(ts_A) <- c("Value1", "Value2", "Value1_t_1", "Value2_t_1")
>
> lm(Value1 ~ Value2_t_1, ts_A)
Call:
lm(formula = Value1 ~ Value2_t_1, data = ts_A)
Coefficients:
(Intercept) Value2_t_1
6.3929 -0.1071
>
希望有帮助。
答案 1 :(得分:0)
这是使用dplyr软件包的解决方案,您可能会注意到,在下面的代码中,我明确引用了dplyr的lag函数,而不是基数R(统计信息)。这是因为dplyr的滞后函数不需要时间序列输入。
我还要注意,您列出的两个公式可能会产生不同的回归结果,因为您将在不同的数据集上运行它们,即
Value1(k,t + 1)〜Value2(k,t):运行时间为2012年1月1日至2012年1月3日
Value1(k,t)〜Value2(k,t-1):在2012年1月2日至2012年1月4日的时间段内运行
library("tidyverse")
df <- data.frame(User = c(rep("A", 4), rep("B", 4)),
Date = rep(seq.Date(as.Date("2012-01-01"), as.Date("2012-01-04"), by = "day"), 2),
Value1 = c(4, 5, 6, 7, 2, 3, 4, 5),
Value2 = c(3, 7, 1, 4, 4, 2, 9, 3))
df2 <- df %>% arrange(User,Date) %>%
group_by(User) %>%
mutate(lag_v2 = dplyr::lag(Value2),
lead_v1 = dplyr::lead(Value1))
df3<-df2[!is.na(df2$lag_v2),]
df4<-df2[!is.na(df2$lead_v1),]
summary(lm(Value1~lag_v2,data=df3))
summary(lm(lead_v1~Value2,data=df4))