rkevinburton at charter.net
2008-Aug-18 04:56 UTC
[R] Fucntion scope question. General non-linear solution help.
I would like to solve the equation is is the sum from k = i to N of choose(N,k) * MR ^ k * (1 - MR) ^ (N - k) - 0.50 = 0 I want to solve for MR. This seems like a non-linear equation to me. But I am having a hard time writing the function that implements the above. I could use 'for(...) as a brute force appoarch but I would like a more "elegant" solution. The variables 'N' and 'i' are basically constant so the function has to take these from some kind of global space. So if I take t brute force apporach I came up with: f <- function(MR) { k <- i:N return sum(choose(N,k) * MR ^ k * (1 - MR) ^ (N - k)) - 0.5 } Does this seem like a reasonable implemetation? How are 'N' and 'i' declare as "global"? For each equation N and I are constant but I want to be able to modify them. In other words solve the equantion after setting N to 6 and i to 5 then again after setting i to 4. The next question is regarding which 'R' function would be best suited to solving this equation? I looked at 'nls' but that seems to take data as an input. I want to solve the equation. What other options do I have? There must be an 'R' function to solve a non-linear equation. I did help.search("non-linear") and the closest match was nlm. But nlm minimizes the function rather than solving it. Ideas? Thank you. Kevin
Prof Brian Ripley
2008-Aug-18 06:32 UTC
[R] Fucntion scope question. General non-linear solution help.
Looks like you want to solve pbinom(k-1, N, p) = 0.5 for p. That is easy: use uniroot. testit <- function(k, N) { fn <- function(p, k, N) pbinom(k-1, N, p) - 0.5 uniroot(fn, c(0,1), k=k, N=N) } testit(6, 10) On Sun, 17 Aug 2008, rkevinburton at charter.net wrote:> I would like to solve the equation is is the sum from k = i to N of > > choose(N,k) * MR ^ k * (1 - MR) ^ (N - k) - 0.50 = 0That's not what you have below: I presume that you want the sum to be 0.5. The sum is 1 - pbinom(k-1, N, MR).> I want to solve for MR. This seems like a non-linear equation to me. But I am having a hard time writing the function that implements the above. I could use 'for(...) as a brute force appoarch but I would like a more "elegant" solution. The variables 'N' and 'i' are basically constant so the function has to take these from some kind of global space. So if I take t brute force apporach I came up with: > > f <- function(MR) > { > k <- i:N > return sum(choose(N,k) * MR ^ k * (1 - MR) ^ (N - k)) - 0.5 > } > > Does this seem like a reasonable implemetation? How are 'N' and 'i' declare as "global"? For each equation N and I are constant but I want to be able to modify them. In other words solve the equantion after setting N to 6 and i to 5 then again after setting i to 4. > > The next question is regarding which 'R' function would be best suited to solving this equation? I looked at 'nls' but that seems to take data as an input. I want to solve the equation. What other options do I have? There must be an 'R' function to solve a non-linear equation. I did help.search("non-linear") and the closest match was nlm. But nlm minimizes the function rather than solving it. > > Ideas? > > Thank you. > > Kevin > > ______________________________________________ > 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 > and provide commented, minimal, self-contained, reproducible code. >-- Brian D. Ripley, ripley at stats.ox.ac.uk Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/ University of Oxford, Tel: +44 1865 272861 (self) 1 South Parks Road, +44 1865 272866 (PA) Oxford OX1 3TG, UK Fax: +44 1865 272595