如何创建一个变量,该变量取决于其先前的值以及 R 中的另一个变量
How can I create a variable that depends on its previous value as well as another variable in R
我是 R 的新手,非常感谢您的帮助。
我有一个面板数据集(公司、年份)和其他变量(数字、X 和 Y)。
给出了所有年份的 X,但我只有每个公司第一年的 Y。
我对 generating/replacing Y=NA
期间的 Y 值感兴趣
Y 的公式如下。
Yt= Xt + 0.85*Yt-1。
即 Y 的当前值取决于 X 以及 Y 的先前值。
我的问题是如何替换 Y 的后续值。
例如
data<-data.frame(id=c(rep(1,3),rep(2,3)), year=c(2000:2002,2002:2004),number=rep(1:3,2), X=c(10,20,30,20,40,10), Y=c(30,NA,NA,50,NA,NA))
我试过下面的代码,但由于某些原因它没有在计算中使用 Y 的滞后值。
library(dplyr)
library(plm)
data<- data %>%
group_by(id)%>%
mutate(Y = replace(Y, number!=1, 0.85*lag(data$Y)+ X))
希望得到如下结果
data<-data.frame(id=c(rep(1,3),rep(2,3)), year=c(2000:2002,2002:2004),number=rep(1:3,2), X=c(10,20,30,20,40,10), Y=c(30,45.5,68.675,50,82.5,80.125))
谁能告诉我如何正确执行此操作?
这里可以用accumulate
library(dplyr)
library(purrr)
data %>%
group_by(id) %>%
mutate(Y = accumulate(X[-1], ~ 0.85 * .x + .y, .init = first(Y))) %>%
ungroup
-输出
# A tibble: 6 × 5
id year number X Y
<dbl> <int> <int> <dbl> <dbl>
1 1 2000 1 10 30
2 1 2001 2 20 45.5
3 1 2002 3 30 68.7
4 2 2002 1 20 50
5 2 2003 2 40 82.5
6 2 2004 3 10 80.1
数据
data <- structure(list(id = c(1, 1, 1, 2, 2, 2), year = c(2000L, 2001L,
2002L, 2002L, 2003L, 2004L), number = c(1L, 2L, 3L, 1L, 2L, 3L
), X = c(10, 20, 30, 20, 40, 10), Y = c(30, NA, NA, 50, NA, NA
)), class = "data.frame", row.names = c(NA, -6L))
这是简单循环起作用的情况之一。
for (i in 1:nrow(data)) {
if(is.na(data$Y[i])) {
data$Y[i] <- 0.85*data$Y[i-1] + data$X[i]
}
}
data
我是 R 的新手,非常感谢您的帮助。
我有一个面板数据集(公司、年份)和其他变量(数字、X 和 Y)。 给出了所有年份的 X,但我只有每个公司第一年的 Y。 我对 generating/replacing Y=NA
期间的 Y 值感兴趣Y 的公式如下。
Yt= Xt + 0.85*Yt-1。 即 Y 的当前值取决于 X 以及 Y 的先前值。
我的问题是如何替换 Y 的后续值。
例如
data<-data.frame(id=c(rep(1,3),rep(2,3)), year=c(2000:2002,2002:2004),number=rep(1:3,2), X=c(10,20,30,20,40,10), Y=c(30,NA,NA,50,NA,NA))
我试过下面的代码,但由于某些原因它没有在计算中使用 Y 的滞后值。
library(dplyr)
library(plm)
data<- data %>%
group_by(id)%>%
mutate(Y = replace(Y, number!=1, 0.85*lag(data$Y)+ X))
希望得到如下结果
data<-data.frame(id=c(rep(1,3),rep(2,3)), year=c(2000:2002,2002:2004),number=rep(1:3,2), X=c(10,20,30,20,40,10), Y=c(30,45.5,68.675,50,82.5,80.125))
谁能告诉我如何正确执行此操作?
这里可以用accumulate
library(dplyr)
library(purrr)
data %>%
group_by(id) %>%
mutate(Y = accumulate(X[-1], ~ 0.85 * .x + .y, .init = first(Y))) %>%
ungroup
-输出
# A tibble: 6 × 5
id year number X Y
<dbl> <int> <int> <dbl> <dbl>
1 1 2000 1 10 30
2 1 2001 2 20 45.5
3 1 2002 3 30 68.7
4 2 2002 1 20 50
5 2 2003 2 40 82.5
6 2 2004 3 10 80.1
数据
data <- structure(list(id = c(1, 1, 1, 2, 2, 2), year = c(2000L, 2001L,
2002L, 2002L, 2003L, 2004L), number = c(1L, 2L, 3L, 1L, 2L, 3L
), X = c(10, 20, 30, 20, 40, 10), Y = c(30, NA, NA, 50, NA, NA
)), class = "data.frame", row.names = c(NA, -6L))
这是简单循环起作用的情况之一。
for (i in 1:nrow(data)) {
if(is.na(data$Y[i])) {
data$Y[i] <- 0.85*data$Y[i-1] + data$X[i]
}
}
data