【问题标题】:Output list of list in RR中列表的输出列表
【发布时间】:2016-05-06 16:00:37
【问题描述】:

目标说明:

有人可以帮我解决这个问题吗: 我试图对线性回归 beta0hat、beta1hat、R2、R2Adjusted 和 P 值的估计量进行蒙特卡罗研究,使用正常的随机变量改变样本大小(30,60,100)和方差(0.5,0.75,1)错误。 首先,我创建了与研究相关的每个长度的 3 个样本,我不想随机化。

X1 =  sample(0:20,30,T)
X2 =  sample(0:20,60,T)
X3 = sample(0:20,100,T)

出于主要目的,我在女巫中创建了这个蒙特卡洛函数,我试图将每个估计量的结果保存在一些适当的向量中,以生成直方图和 Y 轴上的 P 值相对于 R2 的图X 轴来验证估计器的行为,我更改变量并将正常随机设置为错误。

函数的参数: n = 样本大小,sig = 变化的方差,b0 = 真实 betahat0,b1 = 真实 betahat1,X = X 轴的样本

Monte.Carlo = function(n, sig, b0, b1,X){
      Y = b0 + b1 * X + rnorm(n,0,sig)
      smr = summary(lm(Y~X))
      return(smr)
}

为了生成向量作为我在这项研究中的数据来分析估计器的行为,我使用了这样的函数复制:

object.1 = replicate(1000,Monte.Carlo(30,0.5,1.4,0.8,1,X1))
beta0_s0.5_n30 <-list(c(object.1[,1:1000][[4]] [1]))
beta1_s0.5_n30<- object.1[[4]] [2]
R2_s0.5_n30 <- object.1[[8]]
R2A_s0.5_n30 <- object.1[[9]]
valorP_s0.5_n30 <- object.1[[4]] [8]

但是在上面这几代人中我无法弄清楚。

object.1 存储了 1000 个回归摘要。

如何访问回归摘要的每个估计器的 1000 个输出,然后将其存储在适当的向量中,如列表列表,如上面命令行中的意图?

我们的目的是将其应用于几个对象,如下例所示,我已将方差更改为 0.75 并将样本大小更改为 60:

beta0_s0.75_n60 <- replicate(1000,Monte.Carlo(60,0.75,1.4,0.8,X2))
beta1_s0.75_n60<- replicate(1000,Monte.Carlo(60,0.75,1.4,0.8,X2))
R2_s0.75_n60 <- replicate(1000,Monte.Carlo(60,0.75,1.4,0.8,X2))
R2A_s0.75_n60 <- replicate(1000,Monte.Carlo(60,0.75,1.4,0.8,X2))
valorP_s0.75_n60 <- replicate(1000,Monte.Carlo(60,0.75,1.4,0.8,X2))

最后是生成 120 个图表,如本例所示,以比较结果:

hist(R2A_s0.5_n30,breaks=11)
hist(R2A_s0.75_n30,breaks=11)
hist(R2A_s1_n30,breaks=11)
hist(R2A_s0.5_n60,breaks=11)
hist(R2A_s0.75_n60,breaks=11)
hist(R2A_s1_n60,breaks=11)
hist(R2A_s0.5_n100,breaks=11)
hist(R2A_s0.75_n100,breaks=11)
hist(R2A_s1_n100,breaks=11)

如果有人可以提供帮助,我将不胜感激,我尝试了很多解决方案并查看了一些论坛,但根本没有任何区别。

对不起,我的英语语法错误。

非常感谢!

【问题讨论】:

  • 您的代码不起作用@Drope。 object.1 = replicate(1000,Monte.Carlo(30,0.5,1.4,0.8,1,X1)) 行在 Monte.Carlo 函数中有六个参数,而原始函数只有五个。

标签: r list output regression montecarlo


【解决方案1】:

所以我只是假设您最初的 object.1 调用应该只有五个参数,例如 Monte.Carlo 函数本身,并将其缩短为:

object.1 = replicate(1000,Monte.Carlo(30,0.5,1.4,0.8,X1))

然后我制作了一个虚拟数据框(这是一个列表列表),列名是您指定的统计信息

o1 <- data.frame(b0 = 0, b1 = 0, R2 = 0, R2A = 0, vP = 0)

然后创建了一个for循环...

for (r in 1:length(object.1)) {
         o1[r,"b0"]  <- object.1[4,r][[1]][1,1]
         o1[r,"b1"]  <- object.1[4,r][[1]][2,1]
         o1[r,"R2"]  <- object.1[8,r]
         o1[r,"R2A"] <- object.1[8,r]
         o1[r,"vP"]  <- object.1[4,r][[1]][2,4]
}

...对于 Monte.Carlo 函数的每次复制以及通过子集函数提取的相关统计信息 - [[]][,] - 从一千个summary(lm(Y~X))object.1 中创建的对象。 o1 是一个数据框,每列是每个统计量的 1000 个向量。对 object.2、object.3 等应用相同的原则。

附言运行 for 循环,你会收到一条错误消息,说 Error in object.1[4, r] : subscript out of bounds,然后打开 o1,你会看到循环运行良好(我什至检查了每个复制的各个统计信息,它们匹配,所以,不要真的明白那个:)

【讨论】:

  • 这对@Drope 有帮助吗?
  • 您好 llewmills,很抱歉这么长时间才收到您的反馈。事实上,它有助于引导我找到另一种解决方案或解决问题的方法。您编写的代码运行良好,但是当我在 rmarkdown 上播放它时,错误“超出范围”阻止了 knirt to word doc。我已经尝试了很多调整来解决这个问题,但没有奏效。相反,我创建了一个函数,它只返回列表中需要的 1000 个子集,就像你的 data.frame 一样,并且运行良好。无论如何,感谢您为我指明道路。
  • 嗨@Drope。是的,我有点困惑为什么它在明显有效时会产生错误。一种解决方法是在常规 R 脚本中运行 for 循环,然后获取该脚本并在 rmarkdown 中调用数据帧(即o1)。但我很高兴你找到了解决问题的方法。可能会问董事会为什么会发生此错误以及实现相同目标的替代方法,因为能够做到这一点很有用。
猜你喜欢
  • 2020-02-06
  • 2014-04-05
  • 1970-01-01
  • 2018-12-14
  • 2018-06-17
  • 1970-01-01
  • 2018-10-01
  • 1970-01-01
  • 2017-11-14
相关资源
最近更新 更多