【问题标题】:error in plm regressionplm回归中的错误
【发布时间】:2017-09-25 14:12:17
【问题描述】:

同事们!我有面板数据:

    Company year       Beta     NI   Sales  Export Hedge      FL     QR     AT Foreign
1       1 2010 -2.2052800 293000 1881000 78.6816     0 23.5158  1.289 0.6554    3000
2       1 2011 -2.2536069 316000 2647000 81.4885     0 21.7945 1.1787 0.8282   22000
3       1 2012  0.3258693 363000 2987000 82.4908     0 24.5782 1.2428  0.813  -11000
4       1 2013  0.4006030 549000 4546000 79.4325     0 31.4168 0.6038 0.7905   71000
5       1 2014 -0.4508811 348000 5376000 79.2411     0 37.1451 0.6563  0.661  -64000
6       1 2015  0.1494696 355000 5038000 77.1735     0 33.3852 0.9798 0.5483   37000

但是当我尝试使用 plm 包进行回归时,R 显示错误:

panel <- read.csv("Panel.csv",  header=T, sep=";")
p=plm(data=panel,Beta~NI, model="within",index=c("id","year"))


Error in pdim.default(index[[1]], index[[2]]) : 
  duplicate couples (id-time)
In addition: Warning messages:
1: In pdata.frame(data, index) :
  duplicate couples (id-time) in resulting pdata.frame
 to find out which, use e.g. table(index(your_pdataframe), useNA = "ifany")
2: In is.pbalanced.default(index[[1]], index[[2]]) :
  duplicate couples (id-time)

3: In is.pbalanced.default(index[[1]], index[[2]]) :
  duplicate couples (id-time)

我在互联网上搜索了这个错误并阅读它与公司和年份的id有关。但是我没有找到避免这个问题的方法。此外,当我执行 na.omit(panel) 时,R 不会显示错误,但将 NA 数据和公司保留在数据中很重要。请告诉我如何解决这个问题。谢谢。

【问题讨论】:

    标签: r panel-data


    【解决方案1】:

    让我们考虑plm 包中的Produc 数据集。

    data("Produc", package = "plm")
    head(Produc)
    
        state year region     pcap     hwy   water    util       pc   gsp    emp unemp
    1 ALABAMA 1970      6 15032.67 7325.80 1655.68 6051.20 35793.80 28418 1010.5   4.7
    2 ALABAMA 1971      6 15501.94 7525.94 1721.02 6254.98 37299.91 29375 1021.9   5.2
    3 ALABAMA 1972      6 15972.41 7765.42 1764.75 6442.23 38670.30 31303 1072.3   4.7
    4 ALABAMA 1973      6 16406.26 7907.66 1742.41 6756.19 40084.01 33430 1135.5   3.9
    5 ALABAMA 1974      6 16762.67 8025.52 1734.85 7002.29 42057.31 33749 1169.8   5.5
    6 ALABAMA 1975      6 17316.26 8158.23 1752.27 7405.76 43971.71 33604 1155.4   7.7
    

    在此数据集中,信息是随着时间的推移(17 年)和相同的样本单位(美国 48 个州)收集的。

    table(Produc$state, Produc$year)
                     1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986
      ALABAMA           1    1    1    1    1    1    1    1    1    1    1    1    1    1    1    1    1
      ARIZONA           1    1    1    1    1    1    1    1    1    1    1    1    1    1    1    1    1
      ARKANSAS          1    1    1    1    1    1    1    1    1    1    1    1    1    1    1    1    1
      CALIFORNIA        1    1    1    1    1    1    1    1    1    1    1    1    1    1    1    1    1
      ...
    

    plm 要求每个(州、年)对都是唯一的。

    any(table(Produc$state, Produc$year)!=1)
    [1] FALSE
    

    命令plm 可以很好地处理这个数据集:

    plmFit1 <- plm(log(gsp) ~ log(pcap) + log(pc) + log(emp) + unemp,
              data = Produc, index = c("state","year"))
    summary(plmFit1)
    
    
    Oneway (individual) effect Within Model
    Call:
    plm(formula = log(gsp) ~ log(pcap) + log(pc) + log(emp) + unemp, 
        data = Produc, index = c("state", "year"))
    
    Balanced Panel: n=48, T=17, N=816
    
    Residuals :
        Min.  1st Qu.   Median  3rd Qu.     Max. 
    -0.12000 -0.02370 -0.00204  0.01810  0.17500 
    
    Coefficients :
                 Estimate  Std. Error t-value  Pr(>|t|)    
    log(pcap) -0.02614965  0.02900158 -0.9017    0.3675    
    log(pc)    0.29200693  0.02511967 11.6246 < 2.2e-16 ***
    log(emp)   0.76815947  0.03009174 25.5273 < 2.2e-16 ***
    unemp     -0.00529774  0.00098873 -5.3582 1.114e-07 ***
    ---
    Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
    
    Total Sum of Squares:    18.941
    Residual Sum of Squares: 1.1112
    R-Squared:      0.94134
    Adj. R-Squared: 0.93742
    F-statistic: 3064.81 on 4 and 764 DF, p-value: < 2.22e-16
    

    现在我们复制一个(州,年)对:

     Produc[2,2] <- 1970
     any(table(Produc$state, Produc$year)>1)
     [1] TRUE
    

    plm 现在会生成与您在上面描述的相同的错误消息:

    zz <- plm(log(gsp) ~ log(pcap) + log(pc) + log(emp) + unemp,
          data = Produc, index = c("state","year"))
    
    Error in pdim.default(index[[1]], index[[2]]) : 
      duplicate couples (id-time)
    Inoltre: Warning messages:
    1: In pdata.frame(data, index) :
      duplicate couples (id-time) in resulting pdata.frame
     to find out which, use e.g. table(index(your_pdataframe), useNA = "ifany")
    2: In is.pbalanced.default(index[[1]], index[[2]]) :
      duplicate couples (id-time)
    
    3: In is.pbalanced.default(index[[1]], index[[2]]) :
      duplicate couples (id-time)
    

    希望对你有帮助。

    【讨论】:

    • 没有重复的不平衡面板的表的值为零,因此我建议使用any(table(Produc$state, Produc$year) &gt; 1)
    【解决方案2】:

    刚刚发现了另一个警告duplicate couples (id-time) 的案例,虽然没有,但可能值得在这里分享。

    也就是说,如果您出于某种原因尝试将时间变量命名为 "id"

    library(plm)
    data(Produc)
    
    ## duplicate time variable and name it "id"
    Produc <- transform(Produc, id=year)
    
    ## check duplicate couples (id-time)
    stopifnot(!any(table(Produc[, "state"], Produc[, "id"]) > 1))
    
    f1 <- plm(gsp ~ pcap, Produc, index=c("state", "year"), model="within", effect="twoways")
    ## OK
    
    f2 <- plm(gsp ~ pcap, Produc, index=c("state", "id"), model="within", effect="twoways")
    # Warning messages:
    # 1: In pdata.frame(x, index) :
    #   duplicate couples (id-time) in resulting pdata.frame
    #  to find out which, use e.g. table(index(your_pdataframe), useNA = "ifany")
    # 2: In is.pbalanced.default(id, time) : duplicate couples (id-time)
    

    当我们显式创建 plm 面板数据框时,原因就显而易见了,如果您不提供,plm :plm 在内部会这样做。

    ## create pdata.frames
    p1 <- pdata.frame(Produc, index=c("state", "year"))
    p2 <- pdata.frame(Produc, index=c("state", "id"))
    
    head(index(p1))
    #     state year
    # 1 ALABAMA 1970
    # 2 ALABAMA 1971
    # 3 ALABAMA 1972
    # 4 ALABAMA 1973
    # 5 ALABAMA 1974
    # 6 ALABAMA 1975
    
    head(index(p2))
    #     state state.1
    # 1 ALABAMA ALABAMA
    # 2 ALABAMA ALABAMA
    # 3 ALABAMA ALABAMA
    # 4 ALABAMA ALABAMA
    # 5 ALABAMA ALABAMA
    # 6 ALABAMA ALABAMA
    

    正如我们所见,"id" 没有用作变量,而是以某种方式与"state" 列相关联。虽然我不确定,到底出了什么问题,因为all.equal(str(p1), str(p2)) 抛出TRUE

    【讨论】:

    • “id”、“time”和“group”是内部用于索引的列名。如果他们引用的索引与名称所暗示的含义不同,事情就会变得一团糟。开发版本对此有警告,请参阅 NEWS.md:“index: 如果参数 'which' 包含“混淆”值,则发出警告。“混淆”:用户 'id'、'time' 或 ' 调用的索引变量group' 如果它不引用相应的索引(例如,时间索引变量在用户的数据框中称为 'id')。"
    • @Helix123 感谢您的通知,我应该把它作为一张票放在 Github 上。当这个great包的新版本发布时请告诉我,我可以删除答案。
    • 时隔已久的新版本发布
    • @Helix123 谢谢,它现在至少会抛出已宣布的警告。
    猜你喜欢
    • 2020-07-01
    • 2015-10-24
    • 1970-01-01
    • 2014-05-02
    • 2017-08-15
    • 2020-06-30
    • 2021-12-30
    • 1970-01-01
    • 2020-04-27
    相关资源
    最近更新 更多