2010-03-02 3 views
1

Мне было интересно, может ли кто-нибудь помочь мне в этой, казалось бы, легкой задаче. Я использую nlminb для проведения оптимизации и вычисления некоторой статистики по индексу. Вот пример из справки 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 и z, где z выступает в качестве индекса (от 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=2 и z=3 отдельно. Я попробовал by(A, z, function(A) nlminb(c(9,12), hdev)) и 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, представленные здесь.

Если я не прояснился, сообщите мне. Я посмотрю, смогу ли я воспроизвести фактический набор данных и функции, над которыми я работаю (у меня их нет на этом компьютере).

спасибо, что заранее.

ответ

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) 

Следующий код возвращает результаты для каждого г

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])))) 
} 
) 

Теперь, с этим вы получите 3х2 фрейм с результатами $ 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) 
} 
) 
+0

Волшебно, это работает! Позвольте мне внимательно посмотреть на plyr. Большое спасибо! – 2010-03-03 09:46:42