如何 运行 对 R 中的多维面板数据进行回归
How to run regressions on multidimensional panel data in R
我需要 运行 对面板数据进行回归。它有 3 个维度(年份 * 公司 * 国家)。例如:
============================================
year | comp | count | value.x | value.y
------+------+-------+----------+-----------
2000 | A | USA | 1029.0 | 239481
------+------+-------+----------+-----------
2000 | A | CAN | 2341.4 | 129333
------+------+-------+----------+-----------
2000 | B | USA | 2847.7 | 187319
------+------+-------+----------+-----------
2000 | B | CAN | 4820.5 | 392039
------+------+-------+----------+-----------
2001 | A | USA | 7289.9 | 429481
------+------+-------+----------+-----------
2001 | A | CAN | 5067.3 | 589143
------+------+-------+----------+-----------
2001 | B | USA | 7847.8 | 958234
------+------+-------+----------+-----------
2001 | B | CAN | 9820.0 | 1029385
============================================
然而,R 包 plm
似乎无法处理超过 2 维的问题。
我试过了
result <- plm(value.y ~ value.x, data = dataname, index = c("comp","count","year"))
它 returns 错误:
Error in pdata.frame(data, index) :
'index' can be of length 2 at the most (one individual and one time index)
当面板数据(个人*时间)在"individual"范围内超过1维时,你如何运行进行回归?
如果有人遇到同样的情况,我会把我的解决方案放在这里:
R似乎无法应对这种情况。你唯一能做的就是添加假人。如果你添加虚拟变量的分类变量包含太多类别,你可以试试这个:
makedummy <- function(colnum,data,interaction = FALSE,interation_varnum)
{
char0 = colnames(data)[colnum]
char1 = "dummy"
tmp = unique(data[,colnum])
valname = paste(char0,char1,tmp,sep = ".")
valname_int = paste(char0,char1,"int",tmp,sep = ".")
for(i in 1:(length(tmp)-1))
{
if(!interaction)
{
tmp_dummy <- ifelse(data[,colnum]==tmp[i],1,0)
}
if(interaction)
{
index = apply(as.matrix(data[,colnum]),1,identical,y = tmp[i])
tmp_dummy = c()
tmp_dummy[index] = data[index,interation_varnum]
tmp_dummy[!index] = 0
}
tmp_dummy <- data.frame(tmp_dummy)
if(!interaction)
{
colnames(tmp_dummy) <- valname[i]
}
if(interaction)
{
colnames(tmp_dummy) <- valname_int[i]
}
data<-cbind(data,tmp_dummy)
}
return(data)
}
例如:
## Create fake data
fakedata <- matrix(rnorm(300),nrow = 100)
cate <- LETTERS[sample(seq(1,10),100, replace = TRUE)]
fakedata <- cbind.data.frame(cate,fakedata)
## Try this
fakedata <- makedummy(1,fakedata)
## If you need to add dummy*x to see if there is any influences of different categories on the coefficients, try this
fakedata <- makedummy(1,fakedata,interaction = TRUE,interaction_varnum = 2)
这里可能有点啰嗦,我没有细细打磨。欢迎任何建议。现在您可以对数据执行 OLS。
我认为您想使用 lm()
而不是 plm(
)。此博客 post 在这里讨论您的追求:
https://www.r-bloggers.com/r-tutorial-series-multiple-linear-regression/
对于你的例子,我想它看起来像下面这样:
lm(formula = comp ~ count + year, data = dataname)
如果您想控制内部模型中的另一个维度,只需为其添加一个虚拟对象即可:
plm(value.y ~ value.x + count, data = dataname, index = c("comp","year"))
或者(特别是对于高维数据),查看 lfe
包,它可以 'absorb' 附加维度,因此汇总输出不会被虚拟变量污染。
这个问题很像这些:
- fixed effects in R: plm vs lm + factor()
你可能不想创建一个新的虚拟人,然后你可以使用 dplyr 包使用 group_indices
函数。虽然不支持mutate
,但是下面的做法很简单:
fakedata$id <- fakedata %>% group_indices(comp, count)
id
变量将是您的第一个面板维度。因此,您需要将 plm 索引参数设置为 index = c("id", "year")
.
对于替代方案,您可以看看这个问题:R create ID within a group。
我想你也可以这样做:
df <-transform(df, ID = as.numeric(interaction(comp, count, drop=TRUE)))
然后估计
result <- plm(value.y ~ value.x, data = df, index = ("ID","year"))
我需要 运行 对面板数据进行回归。它有 3 个维度(年份 * 公司 * 国家)。例如:
============================================
year | comp | count | value.x | value.y
------+------+-------+----------+-----------
2000 | A | USA | 1029.0 | 239481
------+------+-------+----------+-----------
2000 | A | CAN | 2341.4 | 129333
------+------+-------+----------+-----------
2000 | B | USA | 2847.7 | 187319
------+------+-------+----------+-----------
2000 | B | CAN | 4820.5 | 392039
------+------+-------+----------+-----------
2001 | A | USA | 7289.9 | 429481
------+------+-------+----------+-----------
2001 | A | CAN | 5067.3 | 589143
------+------+-------+----------+-----------
2001 | B | USA | 7847.8 | 958234
------+------+-------+----------+-----------
2001 | B | CAN | 9820.0 | 1029385
============================================
然而,R 包 plm
似乎无法处理超过 2 维的问题。
我试过了
result <- plm(value.y ~ value.x, data = dataname, index = c("comp","count","year"))
它 returns 错误:
Error in pdata.frame(data, index) :
'index' can be of length 2 at the most (one individual and one time index)
当面板数据(个人*时间)在"individual"范围内超过1维时,你如何运行进行回归?
如果有人遇到同样的情况,我会把我的解决方案放在这里:
R似乎无法应对这种情况。你唯一能做的就是添加假人。如果你添加虚拟变量的分类变量包含太多类别,你可以试试这个:
makedummy <- function(colnum,data,interaction = FALSE,interation_varnum)
{
char0 = colnames(data)[colnum]
char1 = "dummy"
tmp = unique(data[,colnum])
valname = paste(char0,char1,tmp,sep = ".")
valname_int = paste(char0,char1,"int",tmp,sep = ".")
for(i in 1:(length(tmp)-1))
{
if(!interaction)
{
tmp_dummy <- ifelse(data[,colnum]==tmp[i],1,0)
}
if(interaction)
{
index = apply(as.matrix(data[,colnum]),1,identical,y = tmp[i])
tmp_dummy = c()
tmp_dummy[index] = data[index,interation_varnum]
tmp_dummy[!index] = 0
}
tmp_dummy <- data.frame(tmp_dummy)
if(!interaction)
{
colnames(tmp_dummy) <- valname[i]
}
if(interaction)
{
colnames(tmp_dummy) <- valname_int[i]
}
data<-cbind(data,tmp_dummy)
}
return(data)
}
例如:
## Create fake data
fakedata <- matrix(rnorm(300),nrow = 100)
cate <- LETTERS[sample(seq(1,10),100, replace = TRUE)]
fakedata <- cbind.data.frame(cate,fakedata)
## Try this
fakedata <- makedummy(1,fakedata)
## If you need to add dummy*x to see if there is any influences of different categories on the coefficients, try this
fakedata <- makedummy(1,fakedata,interaction = TRUE,interaction_varnum = 2)
这里可能有点啰嗦,我没有细细打磨。欢迎任何建议。现在您可以对数据执行 OLS。
我认为您想使用 lm()
而不是 plm(
)。此博客 post 在这里讨论您的追求:
https://www.r-bloggers.com/r-tutorial-series-multiple-linear-regression/
对于你的例子,我想它看起来像下面这样:
lm(formula = comp ~ count + year, data = dataname)
如果您想控制内部模型中的另一个维度,只需为其添加一个虚拟对象即可:
plm(value.y ~ value.x + count, data = dataname, index = c("comp","year"))
或者(特别是对于高维数据),查看 lfe
包,它可以 'absorb' 附加维度,因此汇总输出不会被虚拟变量污染。
这个问题很像这些:
- fixed effects in R: plm vs lm + factor()
你可能不想创建一个新的虚拟人,然后你可以使用 dplyr 包使用 group_indices
函数。虽然不支持mutate
,但是下面的做法很简单:
fakedata$id <- fakedata %>% group_indices(comp, count)
id
变量将是您的第一个面板维度。因此,您需要将 plm 索引参数设置为 index = c("id", "year")
.
对于替代方案,您可以看看这个问题:R create ID within a group。
我想你也可以这样做:
df <-transform(df, ID = as.numeric(interaction(comp, count, drop=TRUE)))
然后估计
result <- plm(value.y ~ value.x, data = df, index = ("ID","year"))