2012-01-23 3 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

Использование присваивания будет означать, что существует множество различных переменных, содержащих каждый набор данных, который загромождает рабочий объект и с ним трудно работать. Было бы лучше прочитать их в списке фреймов данных с '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.QQ [i], model =" random ")', и это заставляет меня сделать это сообщение об ошибке: Ошибка в росте QOG [i] <- merge (QOG, tmp, by = c («год», «страна»),: объект «growth.sub.QQ» не найден –

+0

Я вижу ... ты сделал объявить growthQQ где-то перед циклом? даже QOG? Если нет, вам нужно создать пустой фрейм данных того же размера, что и вы. – Chris

+0

growth.re также должен быть предварительно определен перед циклом, иначе он не может быть распознан – Chris

Смежные вопросы