Рассмотрите возможность разделения вашего набора данных по фирмам, а затем итеративно выполните lm
, используя последовательность seq(1, 4000, by=100)
для подмножества списка разделенных фреймов данных:
# BUILD A LIST OF DATA FRAMES (SIZE = 4,000)
firms_df_list <- split(df, df$firm_id)
# FUNCTION TO CALL lm() AND EXTRACT RESULTS
lm_results <- function(n, df) {
model <- lm(sales ~ size, data = df)
res <- summary(model)
p <- res$fstatistic
c(num_of_firms = n,
sales = res$coefficients[2,1],
std_err = res$coefficients[2,2],
t_stat = res$coefficients[2,3],
t_pvalue = res$coefficients[2,4],
r_sq = res$r.squared,
adj_r_sq = res$adj.r.squared,
f_stat = p[['value']],
f_pvalue = unname(pf(p[1], p[2], p[3], lower.tail=FALSE))
)
}
# BUILD MATRIX RESULTS WHERE ROWS ARE MODEL RUNS AND COLS ARE RESULT ESTIMATES
mat_results <- t(sapply(seq(1, 4000, by=100), function(i) {
# COMBINE FIRM SUBSETS BY RANGE
curr_df <- do.call(rbind, firms_df_list[1:i])
# CALL MODEL AND RETRIEVE RESULTS
lm_results(i, curr_df)
}))
# PLOT ALL SALES BETAS AND NUMBER OF FIRMS
plot(mat_results[,"num_of_firms"], mat_results[,"sales"], type="b",
col="blue", lwd=1, pch=16, xlab="Number of Firms", ylab="Sales Estimate")
Для учета разбивки по годам и месяцам рассмотритеby
(аналогично split
+ lapply
) для поднабора по году, а затем по месяцу с внутренним split
(аналогично вышеуказанному процессу), где каждая итерация запускает необходимую модель.Затем свяжите матрицы на уровне каждого месяца и года для окончательной большой матрицы.Примечание: lm_results
теперь получает еще два параметра для столбцов матрицы месяца и года индикатора.
# FUNCTION TO CALL lm() AND EXTRACT RESULTS
lm_results <- function(n, df, yy, mm) {
model <- lm(sales ~ size, data = df)
res <- summary(model)
p <- res$fstatistic
c(year = yy,
month = mm,
num_of_firms = n,
sales = res$coefficients[2,1],
std_err = res$coefficients[2,2],
t_stat = res$coefficients[2,3],
t_pvalue = res$coefficients[2,4],
r_sq = res$r.squared,
adj_r_sq = res$adj.r.squared,
f_stat = p[['value']],
f_pvalue = unname(pf(p[1], p[2], p[3], lower.tail=FALSE))
)
}
# BUILD A LIST OF MONTHLY MATRICES BY YEAR
firms_mat_list <- by(df, df$yy, function(sub_year){
# BUILD A LIST OF FIRM MATRICES BY MONTH
month_mat_list <- by(sub_year, sub_year$mm, function(sub_month){
firms_df_list <- split(sub_month, sub_month$firm)
# BUILD MATRIX RESULTS WHERE ROWS ARE MODEL RUNS AND COLS ARE RESULT ESTIMATES
mat_results <- t(sapply(seq(1, 4000, by=100), function(i) {
# COMBINE FIRM SUBSETS BY RANGE
curr_df <- do.call(rbind, firms_df_list[1:i])
# CALL MODEL AND RETRIEVE RESULTS
lm_results(i, curr_df, curr_df$yy[1], curr_df$mm[1])
}))
})
do.call(rbind, month_mat_list)
})
firms_matrix <- do.call(rbind, firms_mat_list)
firms_matrix