我是一个完整的统计菜鸟和R的新手,因此这个问题。当我的data
是二进制且每个观察都有bernoulli分布时,我已经尝试为特定情况找到Rao score的实现。我在R语言中偶然发现了anova
但却未能理解如何使用它。因此,我尝试自己为这个特定案例实施Rao得分:
rao.score.bern <- function(data, p0) {
# assume `data` is a list of 0s and 1s
y <- sum(data)
n <- length(data)
phat <- y / n
z <- (phat - p0) / sqrt(p0 * (1 - p0) / n)
p.value <- 2 * (1 - pnorm(abs(z)))
}
我很确定我的代码中存在一个错误,因为它在以下场景中只生成两个不同的p值:
p0 <- 1 / 4
p <- seq(from=0.01, to=0.5, by=0.01)
n <- seq(from=5, to=70, by=1)
g <- expand.grid(n, p)
data <- apply(g, 1, function(x) rbinom(x[1], 1, x[2]))
p.values <- sapply(data, function(x) rao.score.bern(x[[1]], p0))
有人可以告诉我问题在哪里吗?你能否指点我在R?
的内置解决方案答案 0 :(得分:5)
首先测试,然后调试。
rao.score.bern
是否有效?
rao.score.bern(c(0,0,0,1,1,1),1/6))
这返回......没有!通过替换
的终极线来修复它2 * (1 - pnorm(abs(z)))
这消除了不必要的分配。
rao.score.bern(c(0,0,0,1,1,1),1/6))
[1] 0.02845974
好的,现在我们到了某个地方。
不幸的是,代码仍然不起作用。让我们通过调用rao.score.bern
来调试,并用显示输入的东西替换它。不要将它应用于您创建的大输入!使用它的一小部分:
sapply(数据[1:5],函数(x)x [[1]])
[1] 0 0 0 0 0
这不是你的预期,是吗?对于data
的每个元素,它只返回一个零。那怎么样?
sapply(数据[1:5],函数(x)x)
[[1]]
[1] 0 0 0 0 0
[[2]]
[1] 0 0 0 0 0 0
...
[[5]]
[1] 0 0 0 0 0 0 0 0 0
好多了!调用x
中的变量sapply
指向整个向量,这是您要传递给例程的向量。何处
p.values&lt; - sapply(data,function(x)rao.score.bern(x,p0)); HIST(p.values)