Панельная регрессия по группам

Я искал много вопросов, но ни один из них не использует plm.

У меня есть панельные данные за год фирмы dt, каждая фирма имеет разные наблюдения за годом. У меня есть регрессия панели:

plm(y~ lag(x1, 1)+ lag(x2, 1)+ lag(log(x3), 1),
data= dt, model= "within", effect= "twoways", index= c("firm", "fyear"))

Я хочу использовать эту панельную регрессию для каждой группы фирм. Я пробовал by, group by в dplyr и lmList, но ни один из них не работает на plm. Поскольку в моей регрессии есть запаздывающие термины, я должен использовать plm регрессию.


r plm
person 1412mm    schedule 18.08.2018    source источник
comment
Посмотрите, поможет ли вам этот пост вообще stackoverflow.com/questions/51796317/   -  person AndS.    schedule 19.08.2018
comment
Я не понимаю, почему вы хотите сделать регрессию для каждой группы в структуре с фиксированными эффектами - для меня это не имеет смысла. Как только вы избавитесь от всех фирм, кроме одной, вы избавитесь от фиксированных эффектов! plm этого не сделает (и не сможет) и выдаст ошибку. Вы можете изменить на model = "pooling", чтобы получить объединенный OLS, который будет работать.   -  person paqmo    schedule 19.08.2018


Ответы (1)


Предполагая, что у вас есть столбец group:

library(plm)
#get data
data("Produc", package = "plm")
dt=Produc[,c("state","year","gsp","pcap","pc","emp","region")]
colnames(dt)=c("firm","fyear","y","x1","x2","x3","group") #your names + group
plm(y~ lag(x1, 1)+ lag(x2, 1)+ lag(log(x3), 1),
    data= dt, model= "within", effect= "twoways", index= c("firm", "fyear"))
#Model Formula: y ~ lag(x1, 1) + lag(x2, 1) + lag(log(x3), 1)
#
#Coefficients:
#     lag(x1, 1)      lag(x2, 1) lag(log(x3), 1) 
#       -0.50586         0.88671     12417.08080 

# split and lapply
dts=split(dt,dt$group)
regs=lapply(dts,function(dtt)plm(y~ lag(x1, 1)+ lag(x2, 1)+ lag(log(x3), 1),
                            data= dtt, model= "within", effect= "twoways", 
                            index= c("firm", "fyear"))$coefficients)
do.call("rbind",regs)

# > do.call("rbind",regs)
# lag(x1, 1) lag(x2, 1) lag(log(x3), 1)
# 1 -1.51064158 1.96541347        8163.974
# 2 -0.06268382 0.95112243      110801.043
# 3  1.06379297 0.06485576       63507.876
# 4  1.10813773 0.56661881        7429.956
# 5  0.90277939 0.52108922       46308.862
# 6  2.38345950 0.36220682       73134.118
# 7  2.68155543 0.31143095      -23427.304
# 8  1.94446802 0.22973996        5196.212
# 9  1.35110639 1.25191285      -82916.241
person Robert    schedule 18.08.2018