2016-05-13 102 views
3

我剛開始使用R進行統計分析,我仍在學習。我在R中創建循環時遇到了一個問題。我遇到以下情況,我想知道是否有人可以幫助我。對我來說,這似乎是不可能的,但對於你們中的一些人來說,這只是一小塊蛋糕。我有不同年份的不同公司的數據集。對於每家公司,我對同一年有不同的觀察結果,我需要爲每個公司每年運行以下回歸(我有1000多家公司,並且似乎不可能分別對每個公司運行迴歸): Ri = α0 + β1Rm + β2Rz + Ɛ循環迴歸

the data I have looks like the following example: 
Year Firm Ri Rm Rz 
2009 A  30 55 85 
2009 A  11 55 85 
2009 A  1  55 85 
2010 A  7  55 85 
2010 A  15 55 85 
2011 A  20 55 85 
2011 A  3.5 55 85 
2011 A  8  55 85 
2009 B  24 55 85 
2009 B  30 55 85 
2009 B  25 55 85 
2010 B  5.2 55 85 
2010 B  11.8 55 85 
2011 B  78 55 85 
2011 B  90 55 85 
2011 B  57 55 85 

我需要爲每個公司每年獲得B1,B2和誤差項Ɛ。就像這樣:

Year Firm  B1 B2 Ɛ 
2009 A  0.30 0.55 0.85 
2010 A  0.11 0.55 0.85 
2011 A  0.1 0.55 0.85 
2009 B  0.7 0.55 0.85 
2010 B  0.15 0.55 0.85 
2011 B  0.20 0.55 0.85 

預先感謝您的幫助

+0

我知道如何做lm函數,但我不知道如何使用這個函數爲每個公司運行這個函數並獲得我需要的結果。 –

+0

'?lm'並看看'subset =' –

+0

我會使用'dplyr',[像這樣的東西](http://stackoverflow.com/q/22713325/903061)。 – Gregor

回答

1

使用subset =和兩個for循環。

for(i in unique(df$Year)) { 
    for(j in unique(df$Firm)) { 
    print(i) 
    print(j) 
    print(lm(Ri ~ Rm + Rz, data = df, subset = df$Year==i & df$Firm ==j)) 
    } 
} 

根據您的新的輸出:

m <- data.frame(matrix(ncol = 5, nrow = length(unique(df$Year))*length(unique(df$Firm)))) 
l = 0 
for(i in unique(df$Year)) { 
    for(j in unique(df$Firm)) { 
    l = l + 1 
    mod<-lm(Ri ~ Rm + Rz, data = df, subset = df$Year==i & df$Firm ==j) 
    m[l,] <- c(i, 
       as.character(j), 
       mod$coefficients[2], 
       mod$coefficients[3], 
       summary(mod)$sigma) 
    } 
} 
names(m) <- c("Year", "Firm", "B1", "B2", "e") 
+0

謝謝安德魯,我非常感謝你的幫助 –

1

可以遍歷每個FirmYear創建每個像這樣一個獨特的lm

#Assume your data frame is named df 
#Convert Firm and Year to factor variables 
df$Firm <- as.factor(df$Firm) 
df$Year <- as.factor(df$Year) 

#Loop through each level in Firm and Year and generate lm for each 
for(i in levels(df$Firm)){ 
    for(j in levels(df$Year)){ 
    assign(paste0('lm', i, j), lm(Ri~Rm+Rz, data=df[df$Firm==i & df$Y==j,])) 
    } 
} 
2

你可以做到這一點使用循環和子集,但你可以做也可以使用mapply,像這樣。 (我已經制作了一個更大的數據集以便能夠正確演示)。

Year <- sort(rep.int(2009:2011, 30)) 
Firm <- gl(n = 2, k = 15, length = 90, labels = c('A', 'B')) 
dta <- data.frame(Year, Firm, Ri = rnorm(90, 5, 2), Rm = rnorm(90, 2, 1), Rz = rnorm(90, -1, 0.5)) 

filt <- expand.grid(unique(dta$Year), unique(dta$Firm)) 

op <- mapply(function(x, y) lm(Ri ~ Rm + Rz, data = dta, subset = Year == x & Firm == y), 
      filt$Var1, filt$Var2, SIMPLIFY = FALSE) 

sapply(op,coef)