Input.interp

From Testiwiki
Revision as of 12:15, 24 January 2012 by Teemu R (talk | contribs) (uutta koodia lisätty)
Jump to: navigation, search


input.interp is an R function that interprets model inputs from a user-friendly format into explicit and exact mathematical format. The purpose is to make it easy for a user to give input without a need to worry about technical modelling details.

Question

What should be a list of important user input formats, and how should they be interpreted?

Answer

The basic feature is that if a text string can be converted to a meaningful numeric object, it will be. This function can be used when data is downloaded from Opasnet Base: if Result.Text contains this kind of numeric information, it is converted to numbers and fused with Result.

n is the number of iterations in the model. # is any numeric character in the text string.

Example Regular expression Interpretation Output in R
12 000 # # 12000. Text is interpreted as number if space removal makes it a number. as.numeric(gsub(" ", "", Result.text))
12,345 #,# 12.345. Commas are interpreted as decimal points. as.numeric(gsub(",", ".", Result.text)) # Note! Do not use comma as a thousand separator!
-14,23 -#  -14.23. Minus in the beginning of entry is interpreted as minus, not a sign for a range.
50 - 125 # - # Uniform distribution between 50 and 125 data.frame(iter=1:n, result=runif(n,50,125))
-12 345 - -23,56 Uniform distribution between -12345 and -23.56.
1 - 50 # - # Loguniform distribution between 1 and 50 (Lognormality is assumed if the ratio of upper to lower is => 30)
3.1 ± 1.2 or 3.1 +- 1.2 # ± # or # +- # Normal distribution with mean 3.1 and SD 1.2 data.frame(iter=1:n, result=rnorm(n,3.1,1.2))
2.4 (1.8 - 3.0) # (# - #) Normal distribution with mean 2.4 and 95 % confidence interval from 1.8 to 3.0 data.frame(iter=1:n, result=rnorm(n,2.4,(3.0-1.8)/2/1.96))
2.4 (2.0 - 3.2) # (# - #) Lognormal distribution with mean 2.4 and 95 % confidence interval from 2.0 to 3.0. Lognormality is assumed if the difference from mean to upper limit is => 50 % greater than from mean to lower limit.
24 - 35 (odds 5:1) # - # (odds #:#) Odds is five to one that the truth is between 24 and 35. How to calculate this, I don't know yet, but there must be a prior. # : I am not sure whether this is actually needed. Who expresses uncertainties in this way? --Jouni 14:00, 28 December 2011 (EET)
2;4;7 Each entry (2, 4, and 7 in this case) are equally likely to occur. Entries can also be text.
* (in index, or explanatory, columns) The result applies to all locations of this index. With merge() function, this column is not used as a criterion when these rows are merged.

How to actually make this happen in R?

  1. Make a temporary result temp by removing all spaces from Result.Text. Columns: Indices,Result.Result.Text,temp (Indices contains all explanatory columns.)
  2. Replace all "," with "."
  3. Check if there are parentheses "()". If yes, assume that they contain 95 % CI.
  4. Check if there are ranges "#-#".
  5. Divide the rows of the data.frame into two new data.frames with the same list of columns (Indices,Result).
    • If temp is a syntactically correct distribution, take the row to data.frame A and replace Result with temp.
    • Otherwise, take the row to data.frame B and replace Result with Result.Text if that is not NA.
  6. Create a new data.frame with index Iter = 1:n.
  7. Make a random sample from each probability distribution in data.frame A using Iter.
  8. Merge the data.frame B with Iter.
  9. Join data.frames A and B with rbind(). Columns: Iter,Index,Result.

+ Show code

--# : Koodi on vielä vaiheessa, ottaa character vectorin alkiot ja antaa tulkinnat listana. Virhetoleranssi hyvin huono. --Teemu R 03:09, 24 January 2012 (EET) --# : Data.framelle oma wrapperi. Testaamaton, ottaa ja antaa data.framen. --Teemu R 14:15, 24 January 2012 (EET)