1

我想知道是否有人可以帮助我完成这个看似简单的任务。我正在使用 nlminb 进行优化并按索引计算一些统计信息。这是来自 nlminb 帮助的示例。

> x <- rnbinom(100, mu = 10, size = 10)
> hdev <- function(par) {
+     -sum(dnbinom(x, mu = par[1], size = par[2], log = TRUE))
+ }
> nlminb(c(9, 12), hdev)
$par
[1] 9.730000 5.954936
$objective
[1] 297.2074
$convergence
[1] 0
$message
[1] "relative convergence (4)"
$iterations
[1] 10
$evaluations
function gradient
      12       27

假设我生成随机变量x, y并且zwherez充当索引(从 1 到 3)。

> x <- rnbinom(100, mu = 10, size = 10)
> y <- rnbinom(100, mu = 10, size = 10)
> z <- rep(1:3, length=100)
> A <- cbind(x,y,z)
> hdev <- function(par) {
+     -sum(dnbinom(x+y, mu = par[1], size = par[2], log = TRUE))}

1)如何应用nlminb(c(9, 12), hdev)到按索引设置的数据z?换句话说,我想分别nlminb(c(9, 12), hdev)计算z=1, z=2z=3。我尝试了by(A, z, function(A) nlminb(c(9,12), hdev))and sparseby(A, z, function(A) nlminb(c(9,12), hdev)),但它们为 的每个值返回完全相同的值z

2)我想把每个输出变成一个新的数据框,这样它就会变成一个 3X2 矩阵。

[1] Z1_ANSWER_1 Z1_ANSWER_2
[2] Z2_ANSWER_1 Z2_ANSWER_2
[3] Z3_ANSWER_1 Z3_ANSWER_2

由于 nlminb 返回统计的摘要,所以我需要使用CASEZ1<-nlminb$par, CASEZ2<-nlminb$par, CASEZ3<-nlminb$par然后使用 cbind 将它们组合起来。但是,我想自动化这个过程,因为我正在处理的真实数据的类别比z这里提供的要多得多。

如果我没有说清楚,请告诉我。我会看看我是否可以复制我正在处理的实际数据集和功能(我只是在这台计算机上没有它们)。

非常感谢您提前。

4

1 回答 1

1

让我尝试一种方法

x <- rnbinom(100, mu = 10, size = 10)
y <- rnbinom(100, mu = 10, size = 10)
z <- rep(1:3, length=100)
A <- as.data.frame(cbind(x,y,z))

首先加载plyr

library(plyr)

以下代码返回每个 z 的结果

dlply(A, .(z), function(x) {
    hdev <- function(par, mydata) {-sum(dnbinom(mydata, mu = par[1], size = par[2], log = TRUE))}
    nlminb(c(9, 12), hdev, mydata=t(as.vector(x[1] + as.vector(x[2]))))
}
)

现在,有了这个,您将获得一个 3x2 的数据框,其中包含 $par 结果

ddply(A, .(z), function(x) {
    hdev <- function(par, mydata) {-sum(dnbinom(mydata, mu = par[1], size = par[2], log = TRUE))}
    res <- nlminb(c(9, 12), hdev, mydata=t(as.vector(x[1] + as.vector(x[2]))))
    return(res$par)
}
)
于 2010-03-02T08:56:55.337 回答