【问题标题】:How to do double loop and create table?如何做双循环和创建表?
【发布时间】:2015-09-06 21:02:25
【问题描述】:

我是 R 新手,具有 Stata 和 SAS 背景。我通常使用循环来创建变量并加快进程。

我正在执行以下操作:1) 我需要为值 10、20、100 和 1000 运行循环“I”4 次,并将 4 个值存储在向量或表中。 Loop I 运行一个进程 100 次。因此,我们总共有 400 次重复。

首先。我的循环需要制作 100 个大小为 10 的样本,看看有多少样本满足条件并存储数字。 然后制作 100 个大小为 20 的样本,看看其中有多少样本符合条件……等等。

This is the variable for the sample size

    v=c(10,20,100,1000)  
This variable will store the number of observations that meet the condition
    sum.x=c(0,0,0,0)  
This is the variable for the 100 repetitions.

    sample = matrix(0,ncol=1,nrow=100)  
This is the loop.

    for (x in seq(along=v)){
    for (i in 1:100) {
      data=rnorm(`v`,0.25,1)
      test=t.test(data)
      sample[i,1]=test$p.value
    }
    sum.x[v]=sum(sample>0.05)  
      }

代码运行良好,只是它没有做我需要做的事情:

1) sum.x 有 1000 个观察值而不是 4 个。我知道 !"[v]" 表示行的位置或其他内容。我只想创建一个如下命名的向量/变量并创建一个小表:

table=data.fram(sum.x10, sum.x20, sum.x100, sum.x1000).

2) 数据只有 4 个观察值而不是 100 个。主要问题是我不知道如何将四个样本大小与 100 联系起来。

谢谢。

【问题讨论】:

  • 你的第一个循环有索引x,但在循环内你使用v
  • "sum.x[v]" 等同于 "c(sum.x[10],sum.x[20],sum.x[100],sum.x[1000] )”。因此,在脚本“sum.x”的最后一条语句之后,长度为 1000。
  • 我知道循环有错误,我明白原因。问题是我只是不知道如何将我想做的这两件事联系起来。感谢您抽出宝贵时间。

标签: r loops


【解决方案1】:

大多数 R 人都会贬低循环。也许这行得通:

v=c(10,20,100,1000)  

f <- function(n)
{
  sum( sapply( rep(n,100),
       function(n){t.test(rnorm(n,0.25,1))[["p.value"]] > 0.05} ) )
}

table <- sapply(v,f)

.

> table
[1] 83 81 40  0
  • 功能

    function(n){t.test(rnorm(n,0.25,1))[["p.value"]] > 0.05}
    

    在函数f 内部从 一个 大小为 n 的随机样本 均值为 0.25,标准差为 1 的正态分布, 使用此随机样本作为数据值执行 t 检验,并且 检查其 p 值是否大于 0,05。 结果逻辑值是 TRUE 当且仅当随机样本 满足p值大于0.05的条件。

  • 然后

    sapply(rep(n,100),function(n){...})
    

    将此函数应用于向量 rep(n,100) 的每个分量。 这意味着测试重复 100 次。 结果是一个长度为 100 的逻辑向量。

  • 现在

    sum(sapply(...))
    

    对这个逻辑向量的条目求和, 其中 TRUE 和 FALSE 分别取 1 和 0。
    因此结果是 t 检验的数量 满足p值大于0.05的条件。

终于

sapply(c(10,20,100,1000),f)

创建向量

c(f(10,f(20),f(100),f(1000)).

要获得比这个决赛桌更多的信息,可以按如下方式拆分计算:

v=c(10,20,100,1000)  

g <- function(n,m)
{
  sapply( rep(n,m),
          function(n){t.test(rnorm(n,0.25,1))} )
}

f <- function(n)
{
  sum(g(n,100)["p.value",]>0.05)
}

table <- sapply(v,f)

现在g(n,m) 是一个有 9 行和m 列的矩阵。第 i 列包含第 i 次 t 检验的结果,例如

> g(10,5)
            [,1]                [,2]                [,3]                [,4]                [,5]               
statistic   1.117835            0.3290155           1.610792            1.399736            0.8213012          
parameter   9                   9                   9                   9                   9                  
p.value     0.2925871           0.749671            0.1416849           0.195105            0.4326913          
conf.int    Numeric,2           Numeric,2           Numeric,2           Numeric,2           Numeric,2          
estimate    0.2408269           0.06949928          0.5203193           0.4262958           0.2347281          
null.value  0                   0                   0                   0                   0                  
alternative "two.sided"         "two.sided"         "two.sided"         "two.sided"         "two.sided"        
method      "One Sample t-test" "One Sample t-test" "One Sample t-test" "One Sample t-test" "One Sample t-test"
data.name   "rnorm(n, 0.25, 1)" "rnorm(n, 0.25, 1)" "rnorm(n, 0.25, 1)" "rnorm(n, 0.25, 1)" "rnorm(n, 0.25, 1)"
> 

【讨论】:

  • 非常感谢。我有一些问题。我怎么知道该功能正在有效地执行我要求它执行的操作?我的意思是,当我“手动”完成这个过程和我期望的值时,它是一致的。但是,除了决赛桌外,没有任何输出。此外,p 值为 0.05;我正在做一个双尾测试,该命令识别出每个尾我有 0.025 对吗?非常感谢您的耐心和帮助。
  • 我在回答中添加了一些解释。
  • 这是一个了不起的答案。谢谢!
猜你喜欢
  • 1970-01-01
  • 2021-10-05
  • 2015-06-09
  • 1970-01-01
  • 2022-07-12
  • 1970-01-01
  • 2013-10-23
  • 1970-01-01
相关资源
最近更新 更多