2012-01-23 34 views
0

このコードをループに書き直す最良の方法は何ですか?ループ内の回帰ループ

for (i in 1:10) { 
a.data[i] <- read.csv('outdata[i].csv') 
growth.sub.QOG[i] <- merge(QOG, a.data[i], by = c('year', 'country'), all = F) 
growth.re[i] <- plm(NY.GDP.PCAP.KD.ZG ~ log(Enrolment.in.all.programmes..Tertiary..Total) + law + 
        engineering + log(SP.POP.TOTL) + lp.legor 
        ,data=growth.sub.QOG[i], model="random") 
summary(growth.re[i]) 
eststo(growth.re[i]) 
} 

が、それは動作しませんでした、それは私が間違ってやっているということです:

a.data1 <- read.csv('outdata1.csv') 
growth.sub.QOG1 <- merge(QOG, a.data1, by = c('year', 'country'), all = F) 
growth.re1 <- plm(NY.GDP.PCAP.KD.ZG ~ log(Enrolment.in.all.programmes..Tertiary..Total) + law + engineering + log(SP.POP.TOTL) + lp.legor 
,data=growth.sub.QOG1, model="random") 
summary(growth.re1) 
eststo(growth.re1) 


a.data2 <- read.csv('outdata2.csv') 
growth.sub.QOG2 <- merge(QOG, a.data2, by = c('year', 'country'), all = F) 
growth.re2 <- plm(NY.GDP.PCAP.KD.ZG ~ log(Enrolment.in.all.programmes..Tertiary..Total) + law + 
        engineering + log(SP.POP.TOTL) + lp.legor 
        ,data=growth.sub.QOG2, model="random") 
summary(growth.re2) 
eststo(growth.re2) 

a.data3 <- read.csv('outdata3.csv') 
growth.sub.QOG3 <- merge(QOG, a.data3, by = c('year', 'country'), all = F) 
growth.re3 <- plm(NY.GDP.PCAP.KD.ZG ~ log(Enrolment.in.all.programmes..Tertiary..Total) + law + 
        engineering + log(SP.POP.TOTL) + lp.legor 
        ,data=growth.sub.QOG3, model="random") 
summary(growth.re3) 
eststo(growth.re3) 

私はこのような何かをしようとしましたか?

+1

データのインポートとモデリングの手順を分けると便利です。ファイル名を作るには 'paste'を使う必要があります。 – James

答えて

0

があなたのファイル名を構築お知らせください。

残りのコードをどのように構造化するかは、それらの中間変数を気にするかどうかによって異なります。私はあなたがそうすると仮定していたので、たくさんの別々のループがあります。気にしない場合は、lapply文をマージしてください。

データを読み込みます。

all_data <- lapply(file, read.csv) 

マージ。

merged <- lapply(all_data, function(data) 
{ 
    merge(QOG, data, by = c('year', 'country'), all = FALSE) 
}) 

モデル。

models <- lapply(merged, function(data) 
{ 
    plm(
    NY.GDP.PCAP.KD.ZG ~ log(Enrolment.in.all.programmes..Tertiary..Total) + law + engineering + log(SP.POP.TOTL) + lp.legor, 
    data, 
    model = "random" 
) 
}) 

一部の出力を表示します。

(summaries <- lapply(models, summary)) 
(eststos <- lapply(models, eststo)) 
+0

ヒントありがとうございました、それは完璧に機能しました。 –

+0

@NilsOlve:役に立つ答えのそれぞれについて、左上の上向きの矢印をクリックしてupvoteしてください。次に、最良の答えを選択し、目盛りをクリックして正しいものとしてマークします。 –

1

いくつかのサンプルデータは素晴らしかったですが、自発的に私はあなたがそのようなファイルで読むことができないというエラーを見ています。試してみてください。

file.name <- paste('outdata', i, '.csv', sep='') 
    variable <- paste('a.data', i, sep='') 
    data.in <- read.csv(file.name) 

を使用すると、動的に作成変数に格納したい場合は、これは次のように動作します。

assign(variable, data.in) 

これは最初の部分を修正する必要があります!

+0

assignを使用すると、各データセットを含むさまざまな変数が存在することを意味します。これらの変数は、ワークスペースをクラッタさせ、操作するのが困難です。 'lapply' +' read.csv'でデータフレームのリストに読み込むほうがよいでしょう。私の答えを見てください。 –

0

私は、これは

#instance of your directory 
datadir <-"D:/Regression" 
# set working directory, i.e. R knows where to get the data files 
setwd(datadir) 

csvfiles <- list.files(datadir,".csv$") 

#read data from datadir 
for(x in csvfiles) 
{ 
    assign(gsub(" ","",sub(".csv","",x)),read.csv(x,header=TRUE,stringsAsFactors=F,sep=";")) 
} 

data<-c("outdata1,outdata2,outdata3,...") 

i<-1 
for(x in data) 
{ 
    tmp <- eval(parse(text=x)) 
    growth.sub.QOG[i]<- merge(QOG,tmp, by = c('year', 'country'), all = F) 
    growth.re[i] <- plm(NY.GDP.PCAP.KD.ZG ~ log(Enrolment.in.all.programmes..Tertiary..Total) 
        + law + engineering + log(SP.POP.TOTL) + lp.legor, 
        data=tmp, model="random") 
    Summary[i]<-summary(growth.re[i]) 
    Est[i]<-eststo(growth.re[i]) 
    rm(tmp) 
    i<-i+1 
} 

幸運をうまくいくと思うし、私はあなたには、いくつかのエラーが発生した場合...

+0

私を助けてくれてありがとう、私たちは途中にいると思う。しかし、それは動作しません。私は1つのミスを発見したと思う。しかし、私はそれを修正する方法を知らない、あなたがそれを見てみることができれば本当にうれしいだろう。私が見つけた間違いは、この2番目のループです。この行は 'data = tmp、model =" random ")'のようなものでなければなりません: 'data = growthQQ [i]、model =" random ")'これは私にこのエラーメッセージを送ります:Error QOG、tmp、by = c( "year"、 "country"): オブジェクト 'growth_QOG'が見つかりませんでした –

+0

ループの前のどこかQOGを宣言していない場合は、同じサイズの空のデータフレームを作成する必要があります。 – Chris

+0

growth.reもループの前に事前定義する必要があります。 – Chris