[R] problem with a function
li li
hannah.hlx at gmail.com
Fri May 28 19:27:31 CEST 2010
I modified my codes. However it looks like it still has the same problem.
Again, rho.f(0.3) gives the right answer. rho.f(corr[4])
gives wrong answer even though corr[4]==0.3.
The codes are attached.
Thank you very much!!!
> rho.f(0.3)
$est.1
[1] 0.0000000 0.0000000 0.0000000 0.0000000 0.8333333 0.0000000 0.0000000
[8] 0.0000000 1.6666667 0.0000000
$est.2
[1] 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
[9] 1.198658 0.000000
$est.3
[1] 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
[9] 0.862069 0.000000
$est.4
[1] 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000
[9] 12.93103 0.00000
$est.5
[1] 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000
[9] 12.93103 0.00000
> corr <- seq(0,0.9, by=0.1)
> corr[4]
[1] 0.3
> rho.f(corr[4])
$est.1
[1] 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
[8] 0.0000000 0.8333333 0.0000000
$est.2
[1] 0 0 0 0 0 0 0 0 0 0
$est.3
[1] 0 0 0 0 0 0 0 0 0 0
$est.4
[1] 0 0 0 0 0 0 0 0 0 0
$est.5
[1] 0 0 0 0 0 0 0 0 0 0
>
2010/5/28 David Winsemius <dwinsemius at comcast.net>
>
> On May 28, 2010, at 12:03 PM, Sarah Goslee wrote:
>
> From your code:
>>>
>>
>> mean <- c(rep(mu0, mzero), rep(mu1,m-mzero))
>>
>> mean() is a function. If you overwrite it with data, you may mess
>> other things up -
>> any function you call that calls mean will now fail (at best).
>>
>
> Actually, it's bad but not quite that bad.
>
> > mean <- c(1,2,3,4)
> > mean(1:10)
> [1] 5.5
> > mean(mean)
> [1] 2.5
> > mean[3]
> [1] 3
> > mean
> [1] 1 2 3 4
>
> > apply(matrix(1:100, ncol=10),1, mean)
> [1] 46 47 48 49 50 51 52 53 54 55
> > rm(mean) # the interpreter "knows" to only remove the vector object
> > mean
> function (x, ...)
> UseMethod("mean")
> <environment: namespace:base>
> > rm(mean) # and will refuse to remove the base function
> Warning message:
> In rm(mean) : object 'mean' not found
>
>
> Generally the interpreter can tell when a name is being intended as a
> function. Certainly when () follows the name, a function will be sought and
> other objects with identical names ignored.There are exceptions to that
> statement and your point is very well taken, but the main level of confusion
> is in the human brain rather than the R-interpreter. There used to be more
> partial name matching, but my reading of the NEWS items makes me think there
> is a shift away from that facility. Other functions that people often
> mis-use as object names, generally without obvious deleterious effects:
>
> df # the density of the F distribution
> c
> data
> sd
> var
> names
>
>
>> var.f <- function(rho) {
>> (1-rho)*diag(m)+rho*J%*%t(J)
>> }
>>
>> var.f() is a complete function, except that m and J are not passed
>> as arguments. Instead, you rely on them being present in the
>> calling environment, and that is both dangerous and bad practice.
>>
>> Sarah
>>
>> On Fri, May 28, 2010 at 12:00 PM, li li <hannah.hlx at gmail.com> wrote:
>>
>>> I am not sure about "overwrite mean() with data". My purpose was
>>> to generate random numbers that are from a multivariate normal
>>> distribution with the mean vector.
>>>
>>> For the var.f function, since I already specify m and J, so the only
>>> variable is really rho, so I wrote it as a function of rho only.
>>>
>>> Could you be a little more specific? Thanks a lot again.
>>> 2010/5/28 Sarah Goslee <sarah.goslee at gmail.com>
>>>
>>>>
>>>> There are a bunch of problems in your code:
>>>> you overwrite mean() with data, and that could screw things up.
>>>> you have a function var.f that isn't passed all the arguments it needs.
>>>> est.4 is defined several times, each overwriting the previous.
>>>>
>>>> First you need to clean up these sorts of problems since they can
>>>> lead to all kinds of bizarre results.
>>>>
>>>> Then, if you are still getting unexpected results, please send the list
>>>> a minimal example so that we can take a look.
>>>>
>>>> Sarah
>>>>
>>>
>> --
>> Sarah Goslee
>> http://www.functionaldiversity.org
>>
>> ______________________________________________
>> R-help at 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<http://www.r-project.org/posting-guide.html>
>> and provide commented, minimal, self-contained, reproducible code.
>>
>
> David Winsemius, MD
> West Hartford, CT
>
>
-------------- next part --------------
rdata1.mnorm<-function(m,n,mzero,mu0, mu1,rho )
{
## ARGUEMENTS
# n: sample size
# m: dimension of multivariate normal
library(MASS)
mean1 <- c(rep(mu0, mzero), rep(mu1,m-mzero))
var.f <- function(rho, x,y) {
(1-rho)*diag(x)+rho*y%*%t(y)
}
J <- rep(1, m)
set.seed(103)
x <- mvrnorm(n,mean1, var.f(rho,x=m, y=J))
theta <- matrix(0, nrow=n, ncol=m)
for (i in 1:m){theta[,i]<- mean1[i]>1}
data<-list(s=theta, o=x)
return(data)
}
-------------- next part --------------
rho.f <- function(rho){
###generate data
result <- rdata1.mnorm(m=30,n=10,mzero=5,mu0=0,mu1=2,rho=rho)
o <- result$o
s <- result$s
### the p-values
pv<-1-pnorm(o, 0, 1)
m <- dim(pv)[2]
n <- dim(pv)[1]
lambda <- 0.96
w1 <- apply(pv>lambda, 1, sum)
est.1 <- w1/((1-lambda)*m)
w2 <- numeric(n)
for (i in 1:n){w2[i]<- choose(w1[i],2)}
est2 <- 2*w2/((1-lambda)^2*m*(m-1))
est.2 <- sqrt(est2)
est.3 <- numeric(n)
for (i in 1:n){
if (est.1[i]>0)
{est.3[i]<- est2[i]/est.1[i]}
else
{est.3[i] <- 0}
}
est.4 <- numeric(n)
w4.f <- function(x, lambda){
k <- length(x)-1
w <- numeric(k)
for (i in 1:k){
w[i] <- (x[i]>lambda)*(x[i+1]>lambda)}
s1 <- sum(w)
y <- list(vec=w, sum=s1)
return(y)
}
w4 <- numeric(n)
for (i in 1:n){ w4[i] <- as.numeric(w4.f(pv[i,], lambda)$sum)}
est4 <- w4/((1-lambda)^2*(m-1))
est.4 <- numeric(n)
for (i in 1:n){if (est.1[i]>0)
{est.4[i]<- est4[i]/est.1[i]}
else est.4[i] <- 0}
st.pv <- t(apply(pv,1,sort))
w5 <- numeric(n)
for (i in 1:n){ w5[i] <- as.numeric(w4.f(st.pv[i,], lambda)$sum)}
est5 <- w5/((1-lambda)^2*(m-1))
est.5 <- numeric(n)
for (i in 1:n){if (est.1[i]>0)
{est.5[i]<- est5[i]/est.1[i]}
else est.5[i] <- 0}
y <- list(est.1=est.1, est.2=est.2, est.3=est.3, est.4=est.4,
est.5=est.5)
return(y)
}
corr <- seq(0,0.9, by=0.1)
k<- length(rho)
est.1 <- matrix(0, nrow=k, ncol=n)
est.2 <- matrix(0, nrow=k, ncol=n)
est.3 <- matrix(0, nrow=k, ncol=n)
est.4 <- matrix(0, nrow=k, ncol=n)
est.5 <- matrix(0, nrow=k, ncol=n)
for (i in 1:k){
result <- rho.f(rho[i])
est.1[i,] <- result$est.1
est.2[i,] <- result$est.2
est.3[i,] <- result$est.3
est.4[i,] <- result$est.4
est.5[i,] <- result$est.5
}
More information about the R-help
mailing list