Harold -
   The first way that comes to mind is

doit = function(i,j)exp(sum(log((exp(tmp[i,]*(qq$nodes[j]-b))) /
       (factorial(tmp[i,]) * exp(exp(qq$nodes[j]-b)))))) *
       ((1/(s*sqrt(2*pi)))  * exp(-((qq$nodes[j]-0)^2/(2*s^2))))/
       dnorm(qq$nodes[j]) * qq$weights[j]
t(outer(1:3,1:2,Vectorize(doit)))

but you said you wanted to use apply.  That leads to

doit1 = function(tmpi,nod,wt)
      exp(sum(log((exp(tmpi*(nod-b))) / (factorial(tmpi) *
      exp(exp(nod-b)))))) * ((1/(s*sqrt(2*pi)))  *
      exp(-((nod-0)^2/(2*s^2))))/dnorm(nod) * qq$weights[j]
apply(tmp,1,function(x)mapply(function(n,w)doit1(x,n,w),qq$nodes,qq$weights))

Both seem to agree with your rr1.

                                        - Phil Spector
                                         Statistical Computing Facility
                                         Department of Statistics
                                         UC Berkeley
                                         spec...@stat.berkeley.edu

On Mon, 4 Oct 2010, Doran, Harold wrote:

Sorry about that; s <- 1

-----Original Message-----
From: Gabriela Cendoya [mailto:gabrielacendoya.rl...@gmail.com]
Sent: Monday, October 04, 2010 1:44 PM
To: Doran, Harold
Cc: R-help
Subject: Re: [R] Help with apply

You are missing "s" in your definitions so I can't reproduce your code.

tmp <- data.frame(var1 = sample(c(0:10), 3, replace = TRUE), var2 = 
sample(c(0:10), 3, replace = TRUE), var3 = sample(c(0:10), 3, replace = TRUE))

str(tmp)
'data.frame':   3 obs. of  3 variables:
$ var1: int  9 3 9
$ var2: int  4 6 2
$ var3: int  2 9 3

#I can run the following double loop and yield what I want in the end (rr1) as:

library(statmod)
Q <- 2
b <- runif(3)
qq <- gauss.quad.prob(Q, dist = 'normal', mu = 0, sigma=1)
rr1 <- matrix(0, nrow = Q, ncol = nrow(tmp))
L <- nrow(tmp)
for(j in 1:Q){
+     for(i in 1:L){
+         rr1[j,i] <- exp(sum(log((exp(tmp[i,]*(qq$nodes[j]-b))) /
(factorial(tmp[i,]) *
+         exp(exp(qq$nodes[j]-b)))))) * ((1/(s*sqrt(2*pi)))  *
exp(-((qq$nodes[j]-0)^2/(2*s^2))))/dnorm(qq$nodes[j]) * qq$weights[j]
+                                                }
+                                }
Error: objeto 's' no encontrado
rr1
    [,1] [,2] [,3]
[1,]    0    0    0
[2,]    0    0    0


Gabriela


2010/10/4, Doran, Harold <hdo...@air.org>:
Suppose I have the following data:

tmp <- data.frame(var1 = sample(c(0:10), 3, replace = TRUE), var2 =
sample(c(0:10), 3, replace = TRUE), var3 = sample(c(0:10), 3, replace =
TRUE))

I can run the following double loop and yield what I want in the end (rr1)
as:

library(statmod)
Q <- 2
b <- runif(3)
qq <- gauss.quad.prob(Q, dist = 'normal', mu = 0, sigma=1)
rr1 <- matrix(0, nrow = Q, ncol = nrow(tmp))
L <- nrow(tmp)
                for(j in 1:Q){
                                                for(i in 1:L){
                                                                rr1[j,i] <-
exp(sum(log((exp(tmp[i,]*(qq$nodes[j]-b))) / (factorial(tmp[i,]) *
exp(exp(qq$nodes[j]-b)))))) *

((1/(s*sqrt(2*pi)))  * exp(-((qq$nodes[j]-0)^2/(2*s^2))))/dnorm(qq$nodes[j])
* qq$weights[j]
                                                }
                                }
rr1

But, I think this is so inefficient for large Q and nrow(tmp). The function
I am looping over is:

fn <- function(x, nodes, weights, s, b) {
                exp(sum(log((exp(x*(nodes-b))) / (factorial(x) *
exp(exp(nodes-b)))))) *
                ((1/(s*sqrt(2*pi)))  *
exp(-((nodes-0)^2/(2*s^2))))/dnorm(nodes) * weights
                }

I've tried using apply in a few ways, but I can't replicate rr1 from the
double loop. I can go through each value of Q one step at a time and get
matching values in the rr1 table, but this would still require a loop and
that I think can be avoided.

apply(tmp, 1, fn, nodes = qq$nodes[1], weights = qq$weights[1], s = 1, b =
b)

Does anyone see an efficient way to compute rr1 without a loop?

Harold

sessionInfo()
R version 2.10.1 (2009-12-14)
i386-pc-mingw32

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United
States.1252    LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C                           LC_TIME=English_United
States.1252

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base

other attached packages:
[1] minqa_1.1.9     Rcpp_0.8.6      MiscPsycho_1.6  statmod_1.4.6
lattice_0.17-26 gdata_2.8.0

loaded via a namespace (and not attached):
[1] grid_2.10.1  gtools_2.6.2 tools_2.10.1

        [[alternative HTML version deleted]]

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.



--
_________________________
Lic. María Gabriela Cendoya
Magíster en Biometría
Profesor Adjunto
Facultad de Ciencias Agrarias
UNMdP - Argentina

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.
______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to