我已经编写了以下代码来比较理论上的α=0.05与RStudio中的Buit-in t.test中的经验结果:

set.seed(1)
N <- 1000
n <- 20
k <- 500

poblacion <- rnorm(N, 10, 10) #Sample
mu.pob <- mean(poblacion)
sd.pob <- sd(poblacion)
p <- vector(length=k)
for (i in 1:k) {
  muestra <- poblacion[sample(1:N, n)]
  p[i] <- t.test(muestra, mu=mu.pob)$p.value
}
a_teo <- 0.05
a_emp <- length(p[p < a_teo])/k
sprintf("alpha_teo = %.3f <-> alpha_emp = %.3f", a_teo, a_emp)

它可以打印出理论值和经验值.现在我想让它变得更普遍,对于不同的n值,所以我写了这样的:

set.seed(1)
N <- 1000
n <- 20
k <- 500

z <-c()
for (i in n){
  poblacion <- rnorm(N, 10, 10)
  mu.pob <- mean(poblacion)
  sd.pob <- sd(poblacion)
  p <- vector(length=k)
  for (j in 1:k){
     muestra <- poblacion[sample(1:N, length(n))]
     p[j] <- t.test(muestra, mu = mu.pob)$p.value
  }
  a_teo = 0.05
  a_emp = length(p[p<a_teo])/k
  append(z, a_emp)
  print(sprintf("alpha_teo = %.3f <-> alpha_emp = %.3f", a_teo, a_emp))
}
plot(n, z)

推荐答案

for循环中,仅有sprintf是不够的,您需要将其包装在print中.

> for (i in n) {
+   poblacion <- rnorm(N, 10, 10)
+   mu.pob <- mean(poblacion)
+   sd.pob <- sd(poblacion)
+   p <- vector(length=k)
+   for (j in 1:k) {
+     muestra <- poblacion[sample(1:N, length(n))]
+     p[j] <- t.test(muestra, mu=mu.pob)$p.value
+   }
+   a_teo <- 0.05
+   a_emp <- length(p[p<a_teo])/k
+   print(sprintf("alpha_teo = %.3f <-> alpha_emp = %.3f", a_teo, a_emp))
+ }
[1] "alpha_teo = 0.050 <-> alpha_emp = 0.056"
[1] "alpha_teo = 0.050 <-> alpha_emp = 0.050"
[1] "alpha_teo = 0.050 <-> alpha_emp = 0.064"
[1] "alpha_teo = 0.050 <-> alpha_emp = 0.048"

一种更接近R的方法是将逻辑包装在一个函数中.

> comp_fn <- \(N, n, k, alpha=.05, verbose=FALSE) {
+   poblacion <- rnorm(N, 10, 10)
+   mu.pob <- mean(poblacion)
+   sd.pob <- sd(poblacion)
+   p <- replicate(k, t.test(poblacion[sample(1:N, n)], mu=mu.pob)$p.value)
+   a_emp <- length(p[p < alpha])/k
+   if (verbose) {
+     message(sprintf("alpha_teo = %.3f <-> alpha_emp = %.3f", a_teo, a_emp))
+   }
+   c(a_teo, a_emp)
+ }
> 
> set.seed(1)
> comp_fn(1000, 20, 500)
[1] 0.050 0.058
> comp_fn(1000, 20, 500, verbose=TRUE)
alpha_teo = 0.050 <-> alpha_emp = 0.042
[1] 0.050 0.042

要循环不同的论点,mapply是你的朋友.

> set.seed(1)
> mapply(comp_fn, 1000, c(2, 10, 15, 20), 500)
      [,1]  [,2]  [,3]  [,4]
[1,] 0.050 0.050 0.050 0.050
[2,] 0.058 0.054 0.048 0.046

R相关问答推荐

如何根据包含相同值的某些列获取总额

如何修复R码的置换部分?

根据选中三个复选框中的一个或两个来调整绘图

将向量组合到一个数据集中,并相应地命名行

用值序列对行进行子集化,并标识序列开始的列

R—将各种CSV数字列转换为日期

plotly hover文本/工具提示在shiny 中不起作用

Select 季度月值

有没有办法使用ggText,<;Sub>;&;<;sup>;将上标和下标添加到同一元素?

如何识别倒排的行并在R中删除它们?

为什么我使用geom_density的绘图不能到达x轴?

按时间顺序对不同事件进行分组

R -如何分配夜间GPS数据(即跨越午夜的数据)相同的开始日期?

R+reprex:在呈现R标记文件时创建可重现的示例

创建列并对大型数据集中的特定条件进行成对比较的更高效程序

如何删除设置大小的曲线图并添加条形图顶部数字的百分比

禁用时,SelecizeInput将变得不透明

位置_道奇在geom_point图中不躲避

图中显示错误 colored颜色 的图例geom_sf

如何准确地指出Read_delim所面临的问题?