我想使用 R 中的循环来估计数据中城市和年份的不同组合的交互矩阵。目标是检查我可以运行估计的最大可能组合,因为我的数据有 13 年的大约 5000 个城市,并且它无法一起估算所有城市。 然而,大多数组合我都会遇到错误。
数据是使用recovernetwork包(自定义)中的gendata函数生成的。这不是我使用的数据,但是recovernetwork函数需要这种格式的数据(必须称为数据)(id, time, y, x1, x2.....)。在我的数据中,我有 id、时间、y、x1、x2
循环有什么问题? 每次成功迭代后我应该得到 Unpenalized GMM
library(devtools)
install_github("pedroclsouza/recovernetwork")
library(recoverNetwork)
library(tidyverse)
data <- gendata(setting=15,seed=1)
View(data)
t_time <- 13
n_id <-30
estimates <- list()
for (current_id in 2:n_id) {
for (current_time in 2:t_time) {
id_subset <- 1:current_id
time_subset <- 1:current_time
data <- data[data$id %in% id_subset & data$time %in% time_subset, c("id", "time", "y", "x1")]
result_name <- paste("ID", current_id, "Time", current_time, sep = "_")
estimates[[result_name]] <- tryCatch({
rn <- recoverNetwork(data,lambda=c(0.10,0.10,0.10))
rn$unpenalisedgmm$W
}, error = function(e) {
message(paste("Error for", result_name, ":", e$message))
NULL
})
}
}
在Staging Ground中,您要求基于
lapply
而不是for
循环的解决方案,尽管正如我在评论中所写,我不认为这是您错误的根源。
我的代码未经测试,因为我没有
recovernetwork
包。
# First, a function to handle a single combination of id and time
do_it <- function(current_time, current_id, input_data) {
id_subset <- 1:current_id
time_subset <- 1:current_time
data <- input_data[data$id %in% id_subset & input_data$time %in% time_subset, c("id", "time", "y", "x1")]
tryCatch({
result <- recoverNetwork(data,lambda=c(0.10,0.10,0.10))$unpenalisedgmm$W
},
error = function(e) {
result <- message(paste("Error: ", e$message))
})
# Replacement for result_name. This will make it easier to subset results
# according to flexible criteria. You can take the same approach with result_name
# if you wish.
attr(result, "id") <- current_id
attr(result, "time") <- current_time
result
}
# Now apply it to the combinations of id and time that you want
all_data <- gendata(setting=15,seed=1)
t_time <- 13
n_id <-30
estimates <- lapply(
2:n_id,
function(current_id) {
lapply(
2:t_time,
do_it,
current_id = current_id,
input_data = all_data
)
}
)
lapply
的工作原理是将其第一个参数的每个元素依次传递给其第二个参数定义的函数。 其余参数也传递给该函数。由 lapply
传递给函数的值被分配给函数的第一个参数。
基于 tidyverse
和
group_by
(或类似)的
group_map
解决方案在这里不起作用,因为您的子集重叠。 如果我使用
tidyverse
,我会更改
do_it
的参数顺序,以便
input_data
排在第一位。 这将使
do_it
更容易在管道中使用。