Циклы регрессии в R - PullRequest
       11

Циклы регрессии в R

0 голосов
/ 23 января 2012

Каков наилучший способ переписать этот код в цикл?

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

но это не сработало, что я делаю не так?

Ответы [ 3 ]

1 голос
/ 23 января 2012

некоторые примеры данных были бы хорошими, но спонтанно я вижу ошибку, которую вы не сможете прочитать в этом файле.попробуйте:

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

, если вы хотите сохранить его в динамически создаваемой переменной, это работает так:

  assign(variable, data.in)

это должно исправить первую часть!

0 голосов
/ 23 января 2012

Создайте свои имена файлов.

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

То, как вы структурируете остальную часть своего кода, зависит от того, заботитесь ли вы об этих промежуточных переменных или нет.Я предполагал, что вы делаете, поэтому у вас есть много отдельных циклов.Если вам все равно, объедините операторы 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 голосов
/ 23 января 2012

Я думаю, что это работает

#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
}

Удачи, и дайте мне знать, если вы столкнетесь с ошибкой ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...