r - 如何进行双循环并建表?

标签 r loops

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

我正在执行以下操作:1)我需要为值 10,20,100 和 1000 运行循环“I”4 次,并将 4 个值存储在向量或表中。循环 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 个样本量建立联系。

谢谢。

最佳答案

大多数 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。 当且仅当随机样本 满足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)"
> 

关于r - 如何进行双循环并建表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32428278/

相关文章:

r - R:转换小时:分钟:秒

r - 将多个 csv 文件平均为 r 中的 1 个平均文件

javascript - 为什么for循环没有运行?

python - 使用 MovieStim2 在 PsychoPy 中基于按键跳过视频(循环)

MySQL - 在多次插入时使用最后插入的 ID

javascript - 表中的双 *ngFor - Angular 2

Java最大函数递归

r - 在我的混合模型上使用 lme4 预测函数时遇到问题

r - 将列从一个数据帧合并到另一个数据帧(left_join 不起作用)- rstudio

r - 如何使用 iGraph 在 R 中挖掘主题