2017-02-28 14 views
0

一連の固定効果線形回帰を6つの異なるデータセットで実行しようとしています。各データセットについて、データのサブセットに対して回帰を複数回実行したいと思います。複数の異なるデータセットで同じコードを実行する方法R

私はこれを1回のデータセットに対して1回行うコードを開発しました。しかし、私はジェネリックコードを書いて、6つの別々のデータセットのそれぞれに対してこれを実行できるようにしたいと思います。

これは私がこれまでに例のデータセットを使用しているものである:

month <- (rep(0:35, 36)) 
monthfact <- as.factor(month) 
prodid2<- as.character(rep(112:147, 36)) 
log_value <- rnorm(1296) 
exp_share <- abs(rnorm(1296)) 
regdat <- data.frame(month, monthfact, prodid2, log_value, exp_share) 
#Subset the data into 24 datasets, each of which includes a 13 month window 
subfun<-function(x,y,z) { subset(x,y>=z & y<=z+12)} 
dsets <- lapply(1:24, function(x) subfun(regdat, regdat$month, x-1)) 
#Writing a function for running linear regressions 

lmfun<-function(data){ lm(log_value~monthfact+prodid2, data = data, 
weights = data$exp_share)} 
#Apply the function to all the datasets in the list 
linreg<-lapply(dsets,lmfun) 
coefs<-lapply(linreg,coef) 
#Choose only the coefficients for month 
coefs <- as.data.frame(lapply(coefs, function(x) {x[2:13]})) 
#Add in a row of 0 values for the baseline month 
baseline<-rep(0,each=24) 
coefs<-rbind(baseline,coefs) 

#Compute the index using the dataframe created 
FEindexes<-data.frame(lapply(coefs, function(x) (exp(x))/(exp(x[1])))) 
splices<-FEindexes[2,] 
splices <- apply(splices, 1, cumprod) 
splices <- c(1,splices[1:23]) 
FEindex13<-t(FEindexes[13,]) 
FEWS<-splices*FEindex13 
FEWS<-as.data.frame(FEWS[2:24]) 
firstFEWS<-as.data.frame(FEindexes[,1]) 
colnames(firstFEWS) <- "FEWS_index" 
colnames(FEWS) <- "FEWS_index" 
FEWS<-rbind(firstFEWS,FEWS) 
View(FEWS) 

ことなく、Rでこれを行う方法があります場合、私は6つの別のデータセットでこのコードのすべてを実行するのが好き、と不思議に思っただろうすべてのコードを6回再実行しますか?

ご協力いただきありがとうございます。

+0

私はリストにdata.framesを入れてから、それを実行するために 'lapply'を使うことをお勧めします。いくつかのヒントについては、[this post](http://stackoverflow.com/questions/17499013/how-do-i-make-a-list-of-data-frames)へのgregorの回答を参照してください。 – lmo

+0

あなたはあなたが探しているものだけをやっているようです。ではない?しかし、あなたは回帰レベルで止まった。今度は、関数内で目的のプロセスをラップすることによってさらに進化する必要があります – DJJ

答えて

0

私は単純な例でそれを説明しますので、あなたのサンプルコードは、少し複雑です:あなたはR-スクリプトを分割しても大丈夫であれば、あなたがすべて実行したい機能やAで1つのスクリプトを使用することができ

ソース(...)を介して最初のスクリプトを別のデータセットで呼び出す2番目のスクリプト。 非常に簡単な例:作業ディレクトリに「my_functions.R」として、このスクリプトを保存(またはあなたがソース()を呼び出すときに、ファイルの場所を指定):

plot(my.data) 

あなたはすべてのデータ・セットのリストを持っていると仮定すると、 (だけでなく、データフレームの列や、これまでどのような構造で動作)、「)(ソース」を介して最初のスクリプトを呼び出す:

代わり
list.of.my.data <- list(a=1:10, b=11:20, c=21:30) 
for (i in 1:length(list.of.my.data)){ 
    my.data <- list.of.my.data[[i]] 
    source("my_functions.R") 
    } 

、あなたは1 R-スクリプトですべてを保つことを好む場合は、1 huuugeを書くことができます入力として設定されたすべてのデータでこの関数を呼び出します。

# Example: set of data frames in a list 
list.of.data.sets <- list(a=data.frame(x=1:10, y=1:10), 
    b=data.frame(x=1:10, y=11:20), 
    c=data.frame(x=1:10, y=21:30) 
) 
# The meta function where you define all the things you want to do to your data sets: 
my.meta.function <- function(my.data, color.parameter, size.parameter){ 
    plot(y~x, data=my.data, cex=size.parameter, col=color.parameter) 
    my.mean <- mean(my.data$y) 
    return(my.mean) 
    } 
# Call the function for each data set with a for-loop: 
for(i in 1:length(list.of.data.sets)){ 
    my.meta.function(my.data=list.of.data.sets[[i]], size.parameter=4, color.parameter=20) 
    } 
# Call the function for each data set with lapply (faster!): 
results.of.all.data.sets <- lapply(list.of.data.sets, FUN=my.meta.function, size.parameter=4, color.parameter=20) 
関連する問題