【问题标题】:Automate regression with specific dependent and independent variables使用特定的因变量和自变量自动回归
【发布时间】:2017-08-29 19:20:34
【问题描述】:

MVE: 让这成为数据集:

data <- data.frame(year = rep(seq(1966,2015,1), 8), 
               county = c(rep('prva', 50), rep('druga', 50), rep('treća', 50), rep('četvrta', 50),
                          rep('peta', 50), rep('šesta', 50), rep('sedma', 50), rep('osma', 50)),
               crime1 = runif(400), crime2 = runif(400), crime3 = runif(400), 
               uvar1 = runif(400), uvar2 = runif(400), uvar3 = runif(400),
               var1 = runif(400), var2 = runif(400), var3 = runif(400), var4 = runif(400), var5 = runif(400))

假设犯罪1、2 和3 是特定的因变量。 uvar1,2 和 3 是特定的自变量。 var1,2 等是其他协变量。我想要做的是自动化回归。

即,我想得到这段代码的结果:

plm(log(crime1) = log(univar1) + log(var1) + log(var2) + log(var3) + log(var4), model = 'within', effect = 'twoways', data = data)

plm(log(crime2) = log(univar2) + log(var1) + log(var2) + log(var3) + log(var4), model = 'within', effect = 'twoways', data = data)

等等;但无需为每个估计模型编写 20 行代码。

通过查看类似的问题,这是我所想的:

crime <- c('crime1', 'crime2', 'crime3')
plm.results <- lapply(data[, crime], function(y) plm(y ~ var1 + var2 + var3 + var4, 
                                                     model = 'within', effect ='twoways', data = data))

这对我的因变量当然有帮助,但我不知道如何在每个估计中包含特定的自变量。再次澄清一下,我希望 univar1 在第一个回归中,而不是在其余的回归中等等。

【问题讨论】:

    标签: r automation regression plm


    【解决方案1】:

    formula 函数在创建多组模型时很有帮助。您可以合并变体 使用 paste0formulalapply 的组合来遍历索引 1 到 3。

    #remember to set.seed when sampling from distributions
    
    set.seed(123)
    
    #a helper function to create "log(var)" from "var"
    fn_appendLog = function(x) {
     paste0("log(",x,")")
    }
    
    
    
    modelList = lapply(1:3,function(x) {
    
    
    indepVars2 = Reduce(function(x,y) paste(x,y,sep="+"),lapply(colnames(regDF)[grepl("^v",colnames(regDF))],fn_appendLog))
    
    #> indepVars2
    #[1] "log(var1)+log(var2)+log(var3)+log(var4)+log(var5)"
    
    
    indepVars1 = fn_appendLog(paste0("uvar",x))
    
    depVar = fn_appendLog(paste0("crime",x))
    
    formulaVar = formula(paste0(depVar, " ~ ",indepVars1,"+", indepVars2))
    
    #> formulaVar
    #log(crime1) ~ log(uvar1) + log(var1) + log(var2) + log(var3) +  log(var4) + log(var5)
    
    
    modelObj = plm(formulaVar, model = 'within', effect = 'twoways', data = regDF)
    
    
    })
    

    总结:

    summary(modelList[[1]])
    
    #> summary(modelList[[1]])
    #Twoways effects Within Model
    #
    #Call:
    #plm(formula = formulaVar, data = regDF, effect = "twoways", model = "within")
    #
    #Balanced Panel: n=50, T=8, N=400
    #
    #Residuals :
    #   Min. 1st Qu.  Median 3rd Qu.    Max. 
    # -5.730  -0.396   0.116   0.599   1.520 
    #
    #Coefficients :
    #             Estimate Std. Error t-value Pr(>|t|)
    #log(uvar1)  0.0393871  0.0490891  0.8024   0.4229
    #log(var1)  -0.0369356  0.0541029 -0.6827   0.4953
    #log(var2)  -0.0455269  0.0543664 -0.8374   0.4030
    #log(var3)   0.0150516  0.0520347  0.2893   0.7726
    #log(var4)  -0.0034534  0.0441506 -0.0782   0.9377
    #log(var5)  -0.0109038  0.0527446 -0.2067   0.8363
    #
    #Total Sum of Squares:    302.23
    #Residual Sum of Squares: 300.6
    #R-Squared:      0.0053896
    #Adj. R-Squared: 0.0045407
    #F-statistic: 0.304357 on 6 and 337 DF, p-value: 0.93448
    

    说明:

    自变量有两种类型,一种是uvar1,另一种是var1...varN

    1) colnames(regDF)[grepl("^v",colnames(regDF))] 这将为我们提供所有变量的列表 在 regDF 中匹配以字母“v”开头的模式,插入符号表示开始 字符串和$作为字符串的结尾,这个阶段的输出是c("var1","var2"...,"var5")

    2) 我们需要这个变量向量的日志变体,因此我们将它们通过lapply 传递给函数 fn_appendLog,导致list("log(var1)","log(var2)",...,"log(var5)")的列表输出

    3) 接下来,我们需要将这些变量转换为log(var1)+log(var2)...+log(var5)

    4) 为此,我们使用函数 Reduce 和函数 paste(x,y,sep="+"),这需要 上述列表的每个元素与相邻元素并以“+”形式连接在一起

       step1 = (log(var1)+log(var2))
       step2 = (log(var1)+log(var2)) + log(var3)
       step3 = (log(var1)+log(var2)+log(var3))+ log(var4) and so on
    

    5) 函数Reduce 将该函数应用于列表并将输出聚合为单个向量 最终输出log(var1)+log(var2)+log(var3)+log(var4)+log(var5)

    一开始这可能看起来很吓人,但是当您经常使用它们并探索示例时,它们 将立即成为您曲目的一部分。了解lapply 等函数的最佳方法是端到端阅读?lapply 的文档并执行 列出示例,修改参数并熟悉。希望这能有所启发 根据您的查询。

    【讨论】:

    • 正是我想要的。非常感谢!
    • 虽然它工作得很好,但我很想了解你在这里究竟做了什么,我在这部分中挣扎:indepVars2 = Reduce(function(x,y) paste(x,y,sep= "+"), lapply(colnames(data)[grepl("^v",colnames(data))],fn_appendLog)) 请问这部分具体是做什么的?
    • 我已经对涉及Reducelapply的步骤添加了一些解释,如果这样就足够了,请告诉我。
    • 我想运行相同的代码,但是通过使用 felm 包中的 felm 函数来获得县聚集的标准错误。代码在其他方面是相同的,但对于这一行:modelObj = felm(formulaVar |county + year | 0 |county, data =regDf),但它不适用于 felm 函数。它给出以下错误:错误(公式(as.Formula(公式),rhs = 1),特殊=“G”):找不到对象'县'
    • 您能否创建一个链接此问题/答案的新帖子,并包含有关 felm 函数的库和其他详细信息
    猜你喜欢
    • 1970-01-01
    • 2020-05-20
    • 2020-08-14
    • 2020-03-06
    • 1970-01-01
    • 1970-01-01
    • 2020-02-10
    • 1970-01-01
    • 2018-11-16
    相关资源
    最近更新 更多