如何获得参数估计值,例如R中100次试验数据集的k个子组的参数估计值的平均值?
我使用的是R。我有以下问题:我需要对我的数据集的每个子组k(大小相等)执行100多次试验,然后我想得到参数的估计值,作为每个子组100次试验的参数平均值。 我开发了以下代码。我不确定我是否知道如何在两个循环中存储每次迭代时计算平均值所需的参数估计值。我使用了一个列表(“res”),但由于每次重复时我都必须存储一个向量,所以这可能不是一个好的选择:如何获得参数估计值,例如R中100次试验数据集的k个子组的参数估计值的平均值?,r,simulation,lm,R,Simulation,Lm,我使用的是R。我有以下问题:我需要对我的数据集的每个子组k(大小相等)执行100多次试验,然后我想得到参数的估计值,作为每个子组100次试验的参数平均值。 我开发了以下代码。我不确定我是否知道如何在两个循环中存储每次迭代时计算平均值所需的参数估计值。我使用了一个列表(“res”),但由于每次重复时我都必须存储一个向量,所以这可能不是一个好的选择: # Define var-cov matrix rho <- 0.5 row1 <- rho^(c(0:18)) row2 <- r
# Define var-cov matrix
rho <- 0.5
row1 <- rho^(c(0:18))
row2 <- rho^(c(1,0:17))
row3 <- rho^(c(2:1,0:16))
row4 <- rho^(c(3:1,0:15))
row5 <- rho^(c(4:1,0:14))
row6 <- rho^(c(5:1,0:13))
row7 <- rho^(c(6:1,0:12))
row8 <- rho^(c(7:1,0:11))
row9 <- rho^(c(8:1,0:10))
row10 <- rho^(c(9:1,0:9))
row11 <- rho^(c(10:1,0:8))
row12 <- rho^(c(11:1,0:7))
row13 <- rho^(c(12:1,0:6))
row14 <- rho^(c(13:1,0:5))
row15 <- rho^(c(14:1,0:4))
row16 <- rho^(c(15:1,0:3))
row17 <- rho^(c(16:1,0:2))
row18 <- rho^(c(17:1,0:1))
row19 <- rho^(c(18:1,0))
S = round(rbind(row1,row2,row3,row4,row5,row6,row7,row8,row9,row10,row11,row12,row13,row14,row15,row16,row17,row18,row19),4)
library(tidyr)
colnames(S) = c("X2","X3","X4","X5","X6","X7","X8","X9","X10","X11","X12","X13","X14","X15","X16","X17","X18","X19","X20")
rownames(S) = colnames(S)
# Make mean vector
mus = rep(1,19); names(mus) = colnames(S)
res <- list()
result <- list()
for(ii in 1:100){
df = mvrnorm(n = 1000, mu = mus, Sigma = S)
beta <- c(1, runif(19, min = -2.5, max = 2.5))
eps <- rnorm(1000, 0, 1)
sigma <- 0.2*(norm(df*beta, type = '2')/norm(eps, type = '2'))
y <- rowSums(df*beta + sigma*eps)
df <- data.frame(cbind(y, df))
ind = sample(rep(1:10,each = nrow(df)/10)) # split the dataset in k=10 subgroups
k <-lapply(split(1:nrow(df),ind), function(i) df[i,])
for(i in 1:10){
fit <-lm(formula = y ~ X2+X3+X4+X5+X6+X7+X8+X9+X10+X11+X12+X13+X14+X15+X16+X17+X18+X19+X20,
data= k[[i]])
res[[i]] <- fit$coefficients
}
result[[ii]] <- mean(res[[i]])
}
定义var cov矩阵
rho也许思考一下你需要什么样的结构会有所帮助。从我所看到的,结果列表可以在您合并系数后计算。如果您希望将其放在data.frame中,并跟踪模拟编号、拆分编号,请尝试以下操作:
library(purrr)
library(MASS)
library(dplyr)
library(broom)
regform =as.formula('y ~ X2+X3+X4+X5+X6+X7+X8+X9+X10+X11+X12+X13+X14+X15+X16+X17+X18+X19+X20')
func = function(ii,mus,S,matrix=FALSE){
df = mvrnorm(n = 1000, mu = mus, Sigma = S)
beta <- c(1, runif(19, min = -2.5, max = 2.5))
eps <- rnorm(1000, 0, 1)
sigma <- 0.2*(norm(df*beta, type = '2')/norm(eps, type = '2'))
y <- rowSums(df*beta + sigma*eps)
df <- data.frame(cbind(y, df))
df$ind = sample(rep(1:10,each = nrow(df)/10))
df <- df %>% group_by(ind) %>% do(tidy(lm(regform,data=.))) %>% mutate(sim=ii)
if(matrix){
return(split(df$estimate,df$ind))
}else{
return(df)
}
}
result = 1:100 %>% map_dfr(~func(.x,mus=mus,S=S,matrix=FALSE))
> head(result)
# A tibble: 6 x 7
# Groups: ind [1]
ind term estimate std.error statistic p.value sim
<int> <chr> <dbl> <dbl> <dbl> <dbl> <int>
1 1 (Intercept) 13.7 13.3 1.02 0.309 1
2 1 X2 -11.1 5.51 -2.02 0.0467 1
3 1 X3 5.61 5.86 0.957 0.341 1
4 1 X4 -1.48 6.22 -0.239 0.812 1
5 1 X5 -3.82 5.89 -0.649 0.518 1
6 1 X6 2.88 5.95 0.485 0.629 1
> tail(result)
# A tibble: 6 x 7
# Groups: ind [1]
ind term estimate std.error statistic p.value sim
<int> <chr> <dbl> <dbl> <dbl> <dbl> <int>
1 10 X15 11.9 6.41 1.85 0.0679 100
2 10 X16 -8.86 5.77 -1.54 0.128 100
3 10 X17 6.68 5.70 1.17 0.245 100
4 10 X18 3.73 5.81 0.641 0.523 100
5 10 X19 -5.28 5.55 -0.952 0.344 100
6 10 X20 1.14 5.40 0.211 0.833 100
为了获得方法:
map(result,~map(.x,mean))
欢迎来到SO!“有点不对劲”并没有多大帮助。你能说得更具体些吗?你收到错误信息了吗?如果是,在哪里?上面说什么?你没有得到你期望的结果吗?如果是这样,你得到了什么,你想要什么?请阅读并编辑您的问题,使其成为一个最小的工作示例。是的,您是对的!错误的意思是:“eval中的错误(predvars、data、env):objet“X2”未找到”。在我看来,在第二个循环中,R无法读取子组
k
和result
都是列表,因此您应该使用[[
访问单个元素,而不是[
。这会让你开始:你的代码运行,但不会产生任何结果。请阅读我在其他评论中链接的帖子,然后修改你的问题,使其成为MWE。你的解决方案真的很有帮助!非常感谢你的帮助!嗨@StupidWolf,我想知道是否有可能并行和并行运行回归不是按顺序,在这种情况下,运行时间会大大减少。你能说点什么吗?提前谢谢。是的,你可以。看看我试图将future\u map()函数应用到你的代码中。我在循环之外使用它,result=1:100%>%future\u map(map\u dfr(~func(.x,mus=mus,S=S,matrix=FALSE)))…但不起作用。你能给我一些提示吗?1:100%>%future\u map\u dfr(~func(.x,mus=mus,S=S,matrix=FALSE))
result = map(1:100,~func(.x,mus=mus,S=S,matrix=TRUE))
map(result,~map(.x,mean))