2012-01-23 92 views
0

将此代码重新写入循环的最佳方法是什么?R中的循环回归

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) 

我试图做这样的事情:

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

,但它没有工作,它是什么,我做错了吗?

+1

这将有助于分开数据导入和建模步骤。您需要使用'paste'来构建文件名。 – James

回答

0

构建您的文件名。

files <- paste("outdata", 1:3, ".csv", sep = "") 
#alternatively, use list.files/dir as suggested by Chris 

如何构造代码的其余部分取决于您是否在意这些中间变量。我假定你这样做,所以你有很多独立的循环。如果你不在意,请合并乐句陈述。

读入数据。

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:对于对您有用的每个答案,请单击左侧的向上箭头以向上投票。然后选择最佳答案,然后单击打勾将其标记为正确。 –

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

谢谢你帮助我,我认为我们已经完成了一半。但它不起作用;我想我发现了一个错误。但我不知道如何改正,如果你能看一看,我会非常开心。我发现的错误是在第二个循环中。这行:'data = tmp,model =“random”)'应该是这样的:'data = growth.sub.QOG [i],model =“random”)',这导致我做这个错误信息:Error in growth.sub.QOG [i] < - merge(QOG,tmp,by = c(“year”,“country”),: object'growth.sub.QOG'not found –

+0

I see ... did you在循环之前的某个地方声明growth.sub.QOG甚至是QOG?如果不是这样,你必须创建一个空的数据帧,它的大小必须与你想要的一样大。 – Chris

+0

growth.re也应该在循环之前预先定义,否则它不能被识别 – Chris