2017-04-04 8 views
0

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)) 

はのはcrime1,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が最初の回帰に入るようにしたいが、残りの部分には入れない。

答えて

0

formula関数は、複数のモデルセットを作成するときに役立ちます。もし変化を組み込むことができる インデックス1を横断するlapplypaste0formulaの組み合わせを用いて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 

説明:

独立変数2種類あり、最初にuvar1と他var1...varN

1)colnames(regDF)[grepl("^v",colnames(regDF))]これは私たちに、キャレット記号付き文字「V」で始まるのマッチパターンは、文字列の最後に、この段階での出力として 文字列と$の開始を意味regDF内のすべての変数 のリストが表示されます私たちは、それゆえ我々はlist("log(var1)","log(var2)",...,"log(var5)")

3)次のリスト出力につながる機能 fn_appendLoglapplyを介してそれらを通過し、この変数ベクトルの変異体をログに記録必要c("var1","var2"...,"var5")

2)で、我々はこれらのVを必要としますそうするためにlog(var1)+log(var2)...+log(var5)

4)のように変形ariablesは、我々が機能paste(x,y,sep="+")と機能Reduceを使用し、これは隣接する素子と上記リストの 各要素を取得し、

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のドキュメントを最後に読んで、 のリストされた例、そして慣れ親しむ。あなたが照会したところでこれが若干の光を当てたいと思っています

+0

私が探していたものです。本当にありがとう! – Astronaut

+0

これは完全に機能しますが、ここでは正確に何をしたのか理解したいと思っています。この部分は苦労しています:indepVars2 = laply(function(x、y)paste(x、y、sep = "+")、 (colnames(data)[grepl( "^ v"、colnames(data))]、fn_appendLog))この部分が何をしているのか詳しく教えてください。 – Astronaut

+0

'Reduce'と' lapply'を含む手順についていくつかの説明を追加しましたが、これで十分であるかどうか教えてください。 – OdeToMyFiddle