MediaWiki API result

This is the HTML representation of the JSON format. HTML is good for debugging, but is unsuitable for application use.

Specify the format parameter to change the output format. To see the non-HTML representation of the JSON format, set format=json.

See the complete documentation, or the API help for more information.

{
    "batchcomplete": "",
    "continue": {
        "gapcontinue": "Saving_and_loading_a_model",
        "continue": "gapcontinue||"
    },
    "warnings": {
        "main": {
            "*": "Subscribe to the mediawiki-api-announce mailing list at <https://lists.wikimedia.org/postorius/lists/mediawiki-api-announce.lists.wikimedia.org/> for notice of API deprecations and breaking changes."
        },
        "revisions": {
            "*": "Because \"rvslots\" was not specified, a legacy format has been used for the output. This format is deprecated, and in the future the new format will always be used."
        }
    },
    "query": {
        "pages": {
            "66": {
                "pageid": 66,
                "ns": 0,
                "title": "Recipes",
                "revisions": [
                    {
                        "contentformat": "text/x-wiki",
                        "contentmodel": "wikitext",
                        "*": "In this section, we show some more complex code examples. All these code examples can be downloaded [http://www.jstacs.de/downloads/recipes.zip as a zip file] and may serve as a starting points for your own applications.\n\n__TOC__\n\n== Creation of user-specfic alphabet ==\nIn this example, we create a new [http://www.jstacs.de/api-2.0//de/jstacs/data/alphabets/ComplementableDiscreteAlphabet.html ComplementableDiscreteAlphabet] using the generic implementation. We then use this [http://www.jstacs.de/api-2.0//de/jstacs/data/alphabets/Alphabet.html Alphabet] to create a [http://www.jstacs.de/api-2.0//de/jstacs/data/sequences/Sequence.html Sequence] and compute its reverse complement.\n\n\n<source lang=\"java5\" enclose=\"div\">\nString[] symbols = {\"A\", \"C\", \"G\", \"T\", \"-\"};\n//new alphabet\nDiscreteAlphabet abc = new DiscreteAlphabet( true, symbols );\n\n//new alphabet that allows to build the reverse complement of a sequence\nint[] revComp = new int[symbols.length];\nrevComp[0] = 3; //symbols[0]^rc = symbols[3]\nrevComp[1] = 2; //symbols[1]^rc = symbols[2]\nrevComp[2] = 1; //symbols[2]^rc = symbols[1]\nrevComp[3] = 0; //symbols[3]^rc = symbols[0]\nrevComp[4] = 4; //symbols[4]^rc = symbols[4]\nGenericComplementableDiscreteAlphabet abc2 = new GenericComplementableDiscreteAlphabet( true, symbols, revComp );\n\nSequence seq = Sequence.create( new AlphabetContainer( abc2 ), \"ACGT-\" );\nSequence rc = seq.reverseComplement();\nSystem.out.println( seq );\nSystem.out.println( rc );\n</source>\n\n\n== Learning a position weight matrix from data ==\nIn this example, we show how to load sequence data into Jstacs and how to learn a position weight matrix (inhomogeneous Markov model of order 0) on these data.\n\n\n<source lang=\"java5\" enclose=\"div\">\n//read data from FastA file\nDNADataSet ds = new DNADataSet( args[0] );\nAlphabetContainer con = ds.getAlphabetContainer();\n//create position weight matrix model\nTrainableStatisticalModel pwm = TrainableStatisticalModelFactory.createPWM( con, ds.getElementLength(), 4 );\n//train it on the input data\npwm.train( ds );\n//print the trained model\nSystem.out.println(pwm);\n\n</source>\n\n\n== Learning a homogeneous Markov model from data ==\nIn this example, we show how to load sequence data into Jstacs and how to learn a homogeneous Markov model of order 1 on these data.\n\n\n<source lang=\"java5\" enclose=\"div\">\n//read data from FastA file\nDNADataSet ds = new DNADataSet( args[0] );\n//create homogeneous Markov model of order 1\nTrainableStatisticalModel hmm = TrainableStatisticalModelFactory.createHomogeneousMarkovModel( ds.getAlphabetContainer(), 4, (byte)1 );\n//train it on the input data\nhmm.train( ds );\n//print the trained model\nSystem.out.println(hmm);\n</source>\n\n\n== Generating data from a homogeneous Markov model ==\nIn this example, we show how to learn a homogeneous Markov model of order 2 from data (similar to the previous example), and use the learned model to generate new data following the same distribution as the original data.\n\n\n<source lang=\"java5\" enclose=\"div\">\n//read data from FastA file\nDNADataSet ds = new DNADataSet( args[0] );\n//create homogeneous Markov model of order 2\nTrainableStatisticalModel hmm = TrainableStatisticalModelFactory.createHomogeneousMarkovModel( ds.getAlphabetContainer(), 4, (byte)2 );\n//train it on the input data\nhmm.train( ds );\n\n//generate 100 sequences of length 20\nDataSet generated = hmm.emitDataSet( 100, 20 );\n//print these data\nSystem.out.println(generated);\n//and save them to a plain text file\ngenerated.save( new File(args[1]) );\n</source>\n\n\n== Learning a mixture model from data ==\nIn this example, we show how to load sequence data into Jstacs and how to learn a mixture model of two position weight matrices on these data using the expectation maximization algorithm.\n\n\n<source lang=\"java5\" enclose=\"div\">\n//read data from FastA file\nDNADataSet ds = new DNADataSet( args[0] );\n//create position weight matrix model\nTrainableStatisticalModel pwm = TrainableStatisticalModelFactory.createPWM( ds.getAlphabetContainer(), ds.getElementLength(), 4 );\n//create mixture model of two position weight matrices\nTrainableStatisticalModel mixture = TrainableStatisticalModelFactory.createMixtureModel( new double[]{4,4}, new TrainableStatisticalModel[]{pwm,pwm} );\n//train it on the input data using EM\nmixture.train( ds );\n//print the trained model\nSystem.out.println(mixture);\n\n</source>\n\n\n== Analysing data with different models ==\nIn this example, we show how to use the [http://www.jstacs.de/api-2.0//de/jstacs/sequenceScores/statisticalModels/trainable/TrainableStatisticalModelFactory.html TrainableStatisticalModelFactory] to create inhomogeneous and homogeneous Markov models, and Bayesian trees, and how to learn these models on a common data set.\n\n\n<source lang=\"java5\" enclose=\"div\">\n//read data from FastA file\nDNADataSet ds = new DNADataSet( args[0] );\n\n//get alphabet, length from data\nAlphabetContainer alphabet = ds.getAlphabetContainer();\nint length = ds.getElementLength();\n//set ESS used for all models\ndouble ess = 4;\n\nTrainableStatisticalModel[] models = new TrainableStatisticalModel[4];\n//create position weight matrix\nmodels[0] = TrainableStatisticalModelFactory.createPWM( alphabet, length, 4 );\n//create inhomogeneous Markov model of order 1 (WAM)\nmodels[1] = TrainableStatisticalModelFactory.createInhomogeneousMarkovModel( alphabet, length, ess, (byte)1 );\n//create Bayesian tree\nmodels[2] = TrainableStatisticalModelFactory.createBayesianNetworkModel( alphabet, length, ess, (byte)1 );\n//create homogeneous Markov model of order 2\nmodels[3] = TrainableStatisticalModelFactory.createHomogeneousMarkovModel( alphabet, ess, (byte)2 );\n\n//train and print all models\nfor(int i=0;i<models.length;i++){\n\tmodels[i].train( ds );\n\tSystem.out.println(models[i]);\n}\n</source>\n\n\n== De-novo motif discovery with a sunflower hidden Markov model) ==\nIn this example, we show how to use the [http://www.jstacs.de/api-2.0//de/jstacs/sequenceScores/statisticalModels/trainable/hmm/HMMFactory.html HMMFactory] to create a sunflower hidden Markov model (HMM) with two motifs of different lengths. We show how to train the sunflower HMM on input data, which are typically long sequences containing an over-represented motif. After training the HMM, we show how to compute and output the Viterbi paths for all sequences, which give an indication of the position of motif occurrences.\n\n\n<source lang=\"java5\" enclose=\"div\">\n//load data\nDataSet data = new DNADataSet(args[0]);\n//define parameters of Baum-Welch training using all available processor cores\nBaumWelchParameterSet pars = new BaumWelchParameterSet(10, new SmallDifferenceOfFunctionEvaluationsCondition(1E-6), AbstractMultiThreadedOptimizableFunction.getNumberOfAvailableProcessors());\n//create sunflower HMM with motifs of length 8 and 12\nAbstractHMM hmm = HMMFactory.createSunflowerHMM(pars, data.getAlphabetContainer(), 0, data.getElementLength(), true, 8,12);\n//train the HMM using Baum-Welch\nhmm.train(data);\n//print the trained HMM\nSystem.out.println(hmm);\n//print Viterbi paths of all sequences\nfor(int i=0;i<data.getNumberOfElements();i++){\n\tPair<IntList,Double> p = hmm.getViterbiPathFor(data.getElementAt(i));\n\tSystem.out.println(p.getSecondElement()+\"\\t\"+p.getFirstElement());\n}\n</source>\n\n\n== Learning a classifier using the generative maximum a-posteriori principle ==\nIn this example, we show how to train a classifier based on a position weight matrix model and a homogeneous Markov model on training data, and how to use the trained classifier to classify sequences.\n\n\n<source lang=\"java5\" enclose=\"div\">\n//read data from FastA files\nDataSet[] data = new DataSet[2];\ndata[0] = new DNADataSet( args[0] );\ndata[1] = new DNADataSet( args[1] );\n\n//create position weight matrix model\nTrainableStatisticalModel pwm = TrainableStatisticalModelFactory.createPWM( data[0].getAlphabetContainer(), data[0].getElementLength(), 4 );\n//create homogeneous Markov model of order 1\nTrainableStatisticalModel hmm = TrainableStatisticalModelFactory.createHomogeneousMarkovModel( data[1].getAlphabetContainer(), 4, (byte)1 );\n//build a classifier using these models\nTrainSMBasedClassifier cl = new TrainSMBasedClassifier( pwm, hmm );\n//train it on the training data\ncl.train( data );\n\n//print the trained classifier\nSystem.out.println(cl);\n//classify one of the sequences\nSequence seq = data[0].getElementAt( 0 );\nbyte res = cl.classify( seq );\n//print sequence and classification result\nSystem.out.println(seq+\" -> \"+res);\n\n//evaluate\nNumericalPerformanceMeasureParameterSet params = PerformanceMeasureParameterSet.createFilledParameters();\nSystem.out.println( cl.evaluate(params, true, data) );\n</source>\n\n\n== Learning a classifier using the discriminative maximum supervised posterior principle ==\nIn this example, we show how to use the [http://www.jstacs.de/api-2.0//de/jstacs/sequenceScores/statisticalModels/differentiable/DifferentiableStatisticalModelFactory.html DifferentiableStatisticalModelFactory] to create a position weight matrix and how to learn a classifier based on two position weight matrices using the discriminative maximum supervised posterior principle.\n\n\n<source lang=\"java5\" enclose=\"div\">\n//read data from FastA files\nDataSet[] data = new DataSet[2];\ndata[0] = new DNADataSet( args[0] );\ndata[1] = new DNADataSet( args[1] );\nAlphabetContainer con = data[0].getAlphabetContainer();\n\n//define differentiable PWM model\nDifferentiableStatisticalModel pwm = DifferentiableStatisticalModelFactory.createPWM(con, 10, 4);\n//parameters for numerical optimization\nGenDisMixClassifierParameterSet pars = new GenDisMixClassifierParameterSet(con,10,(byte)10,1E-9,1E-10,1, false,KindOfParameter.PLUGIN,true,1);\n//define and train classifier\nAbstractClassifier cl = new MSPClassifier( pars, pwm, pwm );\ncl.train( data );\n\nSystem.out.println(cl);\n</source>\n\n\n== Creating Data sets ==\nIn this example, we show different ways of creating a [http://www.jstacs.de/api-2.0//de/jstacs/data/DataSet.html DataSet] in Jstacs from plain text and FastA files and using the adaptor to BioJava.\n\n\n<source lang=\"java5\" enclose=\"div\">\nString home = args[0]+File.separator;\n\n//load DNA sequences in FastA-format\nDataSet data = new DNADataSet( home+\"myfile.fa\" ); \n\n//create a DNA-alphabet\nAlphabetContainer container = DNAAlphabetContainer.SINGLETON;\n\n//create a DataSet using the alphabet from above in FastA-format\ndata = new DataSet( container, new SparseStringExtractor( home+\"myfile.fa\", StringExtractor.FASTA ));\n\n//create a DataSet using the alphabet from above\ndata = new DataSet( container, new SparseStringExtractor( home+\"myfile.txt\" ));\n\n//defining the ids, we want to obtain from NCBI Genbank:\nGenbankSequenceDB db = new GenbankSequenceDB();\n\n//at the moment the following fails due to a problem in BioJava hopefully fixed in the next legacy release\n//this may fail if BioJava fails to load the sequence, e.g. if you are not connected to the internet\n/*SimpleSequenceIterator it = new SimpleSequenceIterator(\n\t\tdb.getSequence( \"NC_001284.2\" ),\n\t\tdb.getSequence( \"NC_000932.1\" )\n\t\t);\n */\n\nRichSequenceIterator it = IOTools.readGenbankDNA( new BufferedReader( new FileReader( home+\"example.gb\" ) ), null );\n\n//conversion to Jstacs DataSet\ndata = BioJavaAdapter.sequenceIteratorToDataSet( it, null );\nSystem.out.println(data);\n</source>\n\n\n== Using TrainSMBasedClassifier ==\nIn this example, we show how to create a [http://www.jstacs.de/api-2.0//de/jstacs/classifiers/trainSMBased/TrainSMBasedClassifier.html TrainSMBasedClassifier] using to position weight matrices, train this classifier, classify previously unlabeled data, store the classifier to its XML representation, and load it back into Jstacs.\n\n\n<source lang=\"java5\" enclose=\"div\">\nString home = args[0];\n\n//create a DataSet for each class from the input data, using the DNA alphabet\nDataSet[] data = new DataSet[2];\ndata[0] = new DNADataSet( args[1] );\n\n//the length of our input sequences\nint length = data[0].getElementLength();\n\ndata[1] = new DataSet( new DNADataSet( args[2] ), length );\n \n//create a new PWM\nBayesianNetworkTrainSM pwm = new BayesianNetworkTrainSM( new BayesianNetworkTrainSMParameterSet(\n\t\t//the alphabet and the length of the model:\n\t\tdata[0].getAlphabetContainer(), length, \n\t\t//the equivalent sample size to compute hyper-parameters\n\t\t4, \n\t\t//some identifier for the model\n\t\t\"my PWM\", \n\t\t//we want a PWM, which is an inhomogeneous Markov model (IMM) of order 0\n\t\tModelType.IMM, (byte) 0, \n\t\t//we want to estimate the MAP-parameters\n\t\tLearningType.ML_OR_MAP ) );\n \n//create a new classifier\nTrainSMBasedClassifier classifier = new TrainSMBasedClassifier( pwm, pwm );\n//train the classifier\nclassifier.train( data );\n//sequences that will be classified\nDataSet toClassify = new DNADataSet( args[3] );\n \n//use the trained classifier to classify new sequences\nbyte[] result = classifier.classify( toClassify ); \nSystem.out.println( Arrays.toString( result ) );\n \n//create the XML-representation of the classifier\nStringBuffer buf = new StringBuffer();\nXMLParser.appendObjectWithTags( buf, classifier, \"classifier\" );\n \n//write it to disk\nFileManager.writeFile( new File(home+\"myClassifier.xml\"), buf );\n\n//read XML-representation from disk\nStringBuffer buf2 = FileManager.readFile( new File(home+\"myClassifier.xml\") );\n \n//create new classifier from read StringBuffer containing XML-code\nAbstractClassifier trainedClassifier = (AbstractClassifier) XMLParser.extractObjectForTags(buf2, \"classifier\");\t\n</source>\n\n\n== Using GenDisMixClassifier ==\nIn this example, we show how to create [http://www.jstacs.de/api-2.0//de/jstacs/classifiers/differentiableSequenceScoreBased/gendismix/GenDisMixClassifier.html GenDisMixClassifier] s using two position weight matrices. We show how [http://www.jstacs.de/api-2.0//de/jstacs/classifiers/differentiableSequenceScoreBased/gendismix/GenDisMixClassifier.html GenDisMixClassifier] s can be created for all basic learning principles (ML, MAP, MCL, MSP), and how these classifiers can be trained and assessed.\n\n\n<source lang=\"java5\" enclose=\"div\">\n//read FastA-files\nDataSet[] data = {\n         new DNADataSet( args[0] ),\n         new DNADataSet( args[1] )\n};\nAlphabetContainer container = data[0].getAlphabetContainer();\nint length = data[0].getElementLength();\n\n//equivalent sample size =^= ESS\ndouble essFg = 4, essBg = 4;\n//create DifferentiableSequenceScore, here PWM\nDifferentiableStatisticalModel pwmFg = new BayesianNetworkDiffSM( container, length, essFg, true, new InhomogeneousMarkov(0) );\nDifferentiableStatisticalModel pwmBg = new BayesianNetworkDiffSM( container, length, essBg, true, new InhomogeneousMarkov(0) );\n\n//create parameters of the classifier\nGenDisMixClassifierParameterSet cps = new GenDisMixClassifierParameterSet(\n\t\tcontainer,//the used alphabets\n\t\tlength,//sequence length that can be modeled/classified\n\t\tOptimizer.QUASI_NEWTON_BFGS, 1E-1, 1E-1, 1,//optimization parameter\n\t\tfalse,//use free parameters or all\n\t\tKindOfParameter.PLUGIN,//how to start the numerical optimization\n\t\ttrue,//use a normalized objective function\n\t\tAbstractMultiThreadedOptimizableFunction.getNumberOfAvailableProcessors()//number of compute threads\t\t\n);\n\n//create classifiers\nLearningPrinciple[] lp = LearningPrinciple.values();\nGenDisMixClassifier[] cl = new GenDisMixClassifier[lp.length+1];\n//elementary learning principles\nint i = 0;\nfor( ; i < cl.length-1; i++ ){\n\tSystem.out.println( \"classifier \" + i + \" uses \" + lp[i] );\n\tcl[i] = new GenDisMixClassifier( cps, new CompositeLogPrior(), lp[i], pwmFg, pwmBg );\n}\n\n//use some weighted version of log conditional likelihood, log likelihood, and log prior\ndouble[] beta = {0.3,0.3,0.4};\nSystem.out.println( \"classifier \" + i + \" uses the weights \" + Arrays.toString( beta ) );\ncl[i] = new GenDisMixClassifier( cps, new CompositeLogPrior(), beta, pwmFg, pwmBg );\n\n//do what ever you like\n\n//e.g., train\nfor( i = 0; i < cl.length; i++ ){\n\tcl[i].train( data );\n}\n\n//e.g., evaluate (normally done on a test data set)\nPerformanceMeasureParameterSet mp = PerformanceMeasureParameterSet.createFilledParameters();\nfor( i = 0; i < cl.length; i++ ){\n\tSystem.out.println( cl[i].evaluate( mp, true, data ) );\n}\n</source>\n\n\n== Accessing R from Jstacs ==\nHere, we show a number of examples how R can be used from within Jstacs using RServe.\n\n\n<source lang=\"java5\" enclose=\"div\">\nREnvironment e = null;\ntry {\n\t//create a connection to R with YOUR server name, login and password\n\te = new REnvironment();//might be adjusted\n \n\tSystem.out.println( \"java: \" + System.getProperty( \"java.version\" ) );\n\tSystem.out.println();\n\tSystem.out.println( e.getVersionInformation() );\n \n\t// compute something in R\n\tREXP erg = e.eval( \"sin(10)\" );\n\tSystem.out.println( erg.asDouble() );\n \n\t//create a histrgram in R in 3 steps\n\t//1) create the data\n\te.voidEval( \"a = 100;\" );\n\te.voidEval( \"n = rnorm(a)\" );\n\t//2) create the plot command\n\tString plotCmd = \"hist(n,breaks=a/5)\";\n\t//3a) plot as pdf\n\te.plotToPDF( plotCmd, args[0]+\"/test.pdf\", true );\n\t//or\n\t//3b) create an image and show it\n\tBufferedImage i = e.plot( plotCmd, 640, 480 );\n\tREnvironment.showImage( \"histogramm\", i, JFrame.EXIT_ON_CLOSE );\n \n} catch ( Exception ex ) {\n\tex.printStackTrace();\n} finally {\n\tif( e != null ) {\n\t\ttry {\n\t\t\t//close REnvironment correctly\n\t\t\te.close();\n\t\t} catch ( Exception e1 ) {\n\t\t\tSystem.err.println( \"could not close REnvironment.\" );\n\t\t\te1.printStackTrace();\n\t\t}\n\t}\n}\n</source>\n\n\n== Getting ROC and PR curve from a classifier ==\nIn this example, we show how a classifier (loaded from disk) can be assessed on test data, and how we can plot ROC and PR curves of this classifier and test data set.\n\n\n<source lang=\"java5\" enclose=\"div\">\npublic static void main(String[] args) throws Exception {\n\t//read XML-representation from disk\n\tStringBuffer buf2 = FileManager.readFile( new File(args[0]+\"myClassifier.xml\") );\n\t \n\t//create new classifier from read StringBuffer containing XML-code\n\tAbstractClassifier trainedClassifier = (AbstractClassifier) XMLParser.extractObjectForTags(buf2, \"classifier\");\t\n\n\t//create a DataSet for each class from the input data, using the DNA alphabet\n\tDataSet[] test = new DataSet[2];\n\ttest[0] = new DNADataSet( args[1] );\n\t\n\t//the length of our input sequences\n\tint length = test[0].getElementLength();\n\n\ttest[1] = new DataSet( new DNADataSet( args[2] ), length );\n\t\n\t \n\tAbstractPerformanceMeasure[] m = { new PRCurve(), new ROCCurve() };\n\tPerformanceMeasureParameterSet mp = new PerformanceMeasureParameterSet( m );\n\tResultSet rs = trainedClassifier.evaluate( mp, true, test );\n\t \n\tREnvironment r = null;\n\ttry {\n\t\tr = new REnvironment();//might be adjusted\n\t\tfor( int i = 0; i < rs.getNumberOfResults(); i++ )  {\n\t\t\tResult res = rs.getResultAt(i);\n\t\t\tif( res instanceof DoubleTableResult ) {\n\t\t\t\tDoubleTableResult dtr = (DoubleTableResult) res;\n\t\t\t\tImageResult ir = DoubleTableResult.plot( r, dtr );\n\t\t\t\tREnvironment.showImage( dtr.getName(), ir.getValue() );\n\t\t\t} else {\n\t\t\t\tSystem.out.println( res );\n\t\t\t}\n\t\t}\n\t} catch( Exception e ) {\n\t\te.printStackTrace();\n\t} finally {\n\t\tif( r != null ) {\n\t\t\tr.close();\n\t\t}\n</source>\n\n\n== Performing crossvalidation ==\nIn this example, we show how we can compare classifiers built on different types of models and using different learning principles in a cross validation. Specifically, we create a position weight matrix, use that matrix to create a mixture model, and we create an inhomogeneous Markov model of order <math>3</math>. We do so in the world of [http://www.jstacs.de/api-2.0//de/jstacs/sequenceScores/statisticalModels/trainable/TrainableStatisticalModel.html TrainableStatisticalModel] s and in the world of [http://www.jstacs.de/api-2.0//de/jstacs/sequenceScores/statisticalModels/differentiable/DifferentiableStatisticalModel.html DifferentiableStatisticalModel] s. We then use the mixture model as foreground model and the inhomogeneous Markov model as the background model when building classifiers. The classifiers are learned by the generative MAP principle and the discriminative MSP principle, respectively. \nWe then assess these classifiers in a <math>10</math>-fold cross validation.\n\n\n<source lang=\"java5\" enclose=\"div\">\n//create a DataSet for each class from the input data, using the DNA alphabet\nDataSet[] data = new DataSet[2];\ndata[0] = new DNADataSet( args[0] );\n\n//the length of our input sequences\nint length = data[0].getElementLength();\n\ndata[1] = new DataSet( new DNADataSet( args[1] ), length );\n \nAlphabetContainer container = data[0].getAlphabetContainer();\n\n//create a new PWM\nBayesianNetworkTrainSM pwm = new BayesianNetworkTrainSM( new BayesianNetworkTrainSMParameterSet(\n\t\t//the alphabet and the length of the model:\n\t\tcontainer, length, \n\t\t//the equivalent sample size to compute hyper-parameters\n\t\t4, \n\t\t//some identifier for the model\n\t\t\"my PWM\", \n\t\t//we want a PWM, which is an inhomogeneous Markov model (IMM) of order 0\n\t\tModelType.IMM, (byte) 0, \n\t\t//we want to estimate the MAP-parameters\n\t\tLearningType.ML_OR_MAP ) );\n \n//create a new mixture model using 2 PWMs\nMixtureTrainSM mixPwms = new MixtureTrainSM(\n\t\t//the length of the mixture model\n\t\tlength, \n\t\t//the two components, which are PWMs\n\t\tnew TrainableStatisticalModel[]{pwm,pwm},\n\t\t//the number of starts of the EM\n\t\t10,\n\t\t//the equivalent sample sizes\n\t\tnew double[]{pwm.getESS(),pwm.getESS()},\n\t\t//the hyper-parameters to draw the initial sequence-specific component weights (hidden variables)\n\t\t1,\n\t\t//stopping criterion\n\t\tnew SmallDifferenceOfFunctionEvaluationsCondition(1E-6),\n\t\t//parameterization of the model, LAMBDA complies with the\n\t\t//parameterization by log-probabilities\n\t\tParameterization.LAMBDA);\n \n//create a new inhomogeneous Markov model of order 3\nBayesianNetworkTrainSM mm = new BayesianNetworkTrainSM( \n\t\tnew BayesianNetworkTrainSMParameterSet( container, length, 256, \"my iMM(3)\", ModelType.IMM, (byte) 3, LearningType.ML_OR_MAP ) );\n \n//create a new PWM scoring function\nBayesianNetworkDiffSM dPwm = new BayesianNetworkDiffSM(\n\t\t//the alphabet and the length of the scoring function\n\t\tcontainer, length, \n\t\t//the equivalent sample size for the plug-in parameters\n\t\t4, \n\t\t//we use plug-in parameters\n\t\ttrue, \n\t\t//a PWM is an inhomogeneous Markov model of order 0\n\t\tnew InhomogeneousMarkov(0));\n \n//create a new mixture scoring function\nMixtureDiffSM dMixPwms = new MixtureDiffSM(\n\t\t//the number of starts\n\t\t2,\n\t\t//we use plug-in parameters\n\t\ttrue,\n\t\t//the two components, which are PWMs\n\t\tdPwm,dPwm);\n \n//create a new scoring function that is an inhomogeneous Markov model of order 3\nBayesianNetworkDiffSM dMm = new BayesianNetworkDiffSM(container, length, 4, true, new InhomogeneousMarkov(3));\n \n//create the classifiers\nint threads = AbstractMultiThreadedOptimizableFunction.getNumberOfAvailableProcessors();\nAbstractScoreBasedClassifier[] classifiers = new AbstractScoreBasedClassifier[]{\n\t\t\t\t\t\t\t   //model based with mixture model and Markov model\n\t\t\t\t\t\t\t   new TrainSMBasedClassifier( mixPwms, mm ),\n\t\t\t\t\t\t\t   //conditional likelihood based classifier\n\t\t\t\t\t\t\t   new MSPClassifier( new GenDisMixClassifierParameterSet(container, length, \n\t\t\t\t\t\t\t\t\t   //method for optimizing the conditional likelihood and \n\t\t\t\t\t\t\t\t\t   //other parameters of the numerical optimization\n\t\t\t\t\t\t\t\t\t   Optimizer.QUASI_NEWTON_BFGS, 1E-2, 1E-2, 1, true, KindOfParameter.PLUGIN, false, threads),\n\t\t\t\t\t\t\t\t\t   //mixture scoring function and Markov model scoring function\n\t\t\t\t\t\t\t\t\t   dMixPwms,dMm )\n};\n \n//create an new k-fold cross validation using above classifiers\nKFoldCrossValidation cv = new KFoldCrossValidation( classifiers );\n \n//we use a specificity of 0.999 to compute the sensitivity and a sensitivity of 0.95 to compute FPR and PPV\nNumericalPerformanceMeasureParameterSet mp = PerformanceMeasureParameterSet.createFilledParameters();\n//we do a 10-fold cross validation and partition the data by means of the number of symbols\nKFoldCrossValidationAssessParameterSet cvpars = new KFoldCrossValidationAssessParameterSet(PartitionMethod.PARTITION_BY_NUMBER_OF_SYMBOLS, length, true, 10);\n \n//compute the result of the cross validation and print them to System.out\nSystem.out.println( cv.assess( mp, cvpars, data ) );\n</source>\n\n\n== Implementing a TrainableStatisticalModel ==\nIn this example, we show how to implement a new [http://www.jstacs.de/api-2.0//de/jstacs/sequenceScores/statisticalModels/trainable/TrainableStatisticalModel.html TrainableStatisticalModel]. Here, we implement a simple homogeneous Markov models of order <math>0</math> to focus on the technical side of the implementation. A homogeneous Markov model of order <math>0</math> has parameters <math>\\theta_a</math> where <math>a</math> is a symbol of the alphabet <math>\\Sigma</math> and <math>\\sum_{a \\in \\Sigma} \\theta_a = 1</math>. For an input sequence <math>\\mathbf{x} = x_1,\\ldots,x_L</math> it models the likelihood\n\n<math>\\begin{align}\n\nP(\\mathbf{x}|\\boldsymbol{\\theta}) &= \\prod_{l=1}^{L} \\theta_{x_l}.\n\n\\end{align}</math>\n\nIn the implementation, we use log-parameters <math>\\log \\theta_a</math>.\n\n\n<source lang=\"java5\" enclose=\"div\">\npublic class HomogeneousMarkovModel extends AbstractTrainableStatisticalModel {\n \n\tprivate double[] logProbs;//array for the parameters, i.e. the probabilities for each symbol\n \n\tpublic HomogeneousMarkovModel( AlphabetContainer alphabets ) throws Exception {\n\t\tsuper( alphabets, 0 ); //we have a homogeneous TrainableStatisticalModel, hence the length is set to 0\n\t\t//a homogeneous TrainableStatisticalModel can only handle simple alphabets\n\t\tif(! (alphabets.isSimple() && alphabets.isDiscrete()) ){\n\t\t\tthrow new Exception(\"Only simple and discrete alphabets allowed\");\n\t\t}\n\t\t//initialize parameter array\n\t\tthis.logProbs = new double[(int) alphabets.getAlphabetLengthAt( 0 )];\n\t\tArrays.fill( logProbs, -Math.log(logProbs.length) );\n\t}\n \n\tpublic HomogeneousMarkovModel( StringBuffer stringBuff ) throws NonParsableException { \n        super( stringBuff ); \n    }\n \n\tprotected void fromXML( StringBuffer xml ) throws NonParsableException {\n\t\t//extract our XML-code\n\t\txml = XMLParser.extractForTag( xml, \"homogeneousMarkovModel\" );\n\t\t//extract all the variables using XMLParser\n\t\talphabets = (AlphabetContainer) XMLParser.extractObjectForTags( xml, \"alphabets\" );\n\t\tlength = XMLParser.extractObjectForTags( xml, \"length\", int.class );\n\t\tlogProbs = XMLParser.extractObjectForTags( xml, \"logProbs\", double[].class );\n\t}\n \n\tpublic StringBuffer toXML() {\n\t\tStringBuffer buf = new StringBuffer();\n\t\t//pack all the variables using XMLParser\n\t\tXMLParser.appendObjectWithTags( buf, alphabets, \"alphabets\" );\n\t\tXMLParser.appendObjectWithTags( buf, length, \"length\" );\n\t\tXMLParser.appendObjectWithTags( buf, logProbs, \"logProbs\" );\n\t\t//add our own tag\n\t\tXMLParser.addTags( buf, \"homogeneousMarkovModel\" );\n\t\treturn buf;\n\t}\n \n\tpublic String getInstanceName() { \n            return \"Homogeneous Markov model of order 0\"; \n        }\n \n\tpublic double getLogPriorTerm() throws Exception { \n            //we use ML-estimation, hence no prior term\n            return 0; \n        } \n \n\tpublic NumericalResultSet getNumericalCharacteristics() throws Exception {\n\t\t//we do not have much to tell here\n\t\treturn new NumericalResultSet(new NumericalResult(\"Number of parameters\",\"The number of parameters this model uses\",logProbs.length));\n\t}\n \n\tpublic double getLogProbFor( Sequence sequence, int startpos, int endpos ) throws NotTrainedException, Exception {\n\t\tdouble seqLogProb = 0.0;\n\t\t//compute the log-probability of the sequence between startpos and endpos (inclusive)\n\t\t//as sum of the single symbol log-probabilities\n\t\tfor(int i=startpos;i<=endpos;i++){\n\t\t\t//directly access the array by the numerical representation of the symbols\n\t\t\tseqLogProb += logProbs[sequence.discreteVal( i )];\n\t\t}\n\t\treturn seqLogProb;\n\t}\n \n\tpublic boolean isInitialized() {\n        return true; \n    }\n \n\tpublic void train( DataSet data, double[] weights ) throws Exception {\n\t\t//reset the parameter array\n\t\tArrays.fill( logProbs, 0.0 );\n\t\t//default sequence weight\n\t\tdouble w = 1;\n\t\t//for each sequence in the data set\n\t\tfor(int i=0;i<data.getNumberOfElements();i++){\n\t\t\t//retrieve sequence\n\t\t\tSequence seq = data.getElementAt( i );\n\t\t\t//if we do have any weights, use them\n\t\t\tif(weights != null){\n\t\t\t\tw = weights[i];\n\t\t\t}\n\t\t\t//for each position in the sequence\n\t\t\tfor(int j=0;j<seq.getLength();j++){\n\t\t\t\t//count symbols, weighted by weights\n\t\t\t\tlogProbs[ seq.discreteVal( j ) ] += w;\n\t\t\t}\n\t\t}\n\t\t//compute normalization\n\t\tdouble norm = 0.0;\n\t\tfor(int i=0;i<logProbs.length;i++){ norm += logProbs[i]; }\n\t\t//normalize probs to obtain proper probabilities\n\t\tfor(int i=0;i<logProbs.length;i++){ logProbs[i] = Math.log( logProbs[i]/norm ); }\n\t} \n}\n</source>\n\n\n== Implementing a DifferentiableStatisticalModel ==\nIn this example, we show how to implement a new [http://www.jstacs.de/api-2.0//de/jstacs/sequenceScores/statisticalModels/differentiable/DifferentiableStatisticalModel.html DifferentiableStatisticalModel]. Here, we implement a simple position weight matrix, i.e., an inhomogeneous Markov model of order <math>0</math>. Since we want to use this position weight matrix in numerical optimization, we parameterize it in the so called &quot;natural parameterization&quot;, where the probability of symbol <math>a</math> at position <math>l</math> is <math>P(X_l=a | \\boldsymbol{\\lambda}) = \\frac{\\exp(\\lambda_{l,a})}{ \\sum_{\\tilde{a}} \\exp(\\lambda_{l,\\tilde{a}}) }</math>. Since we use a product-Dirichlet prior on the parameters, we transformed this prior to the parameterization we use.\n\nHere, the method <code>getLogScore</code> returns a log-score that can be normalized to a proper log-likelihood by subtracting a log-normalization constant.\nThe log-score for an input sequence <math>\\mathbf{x} = x_1,\\ldots,x_L</math> essentially is\n\n<math>\\begin{align}\n\nS(\\mathbf{x}|\\boldsymbol{\\lambda}) &= \\sum_{l=1}^{L} \\lambda_{l,x_l}.\n\n\\end{align}</math>\n\nThe normalization constant is a partition function, i.e., the sum of the scores over all possible input sequences:\n\n<math>\\begin{align}\n\nZ(\\boldsymbol{\\lambda}) &= \\sum_{\\mathbf{x} \\in \\Sigma^L} \\exp( S(\\mathbf{x}|\\boldsymbol{\\lambda}) )\n\n&= \\sum_{\\mathbf{x} \\in \\Sigma^L} \\prod_{l=1}^{L} \\exp(\\lambda_{l,x_l})\n\n&= \\prod_{l=1}^{L} \\sum_{a \\in \\Sigma} \\exp(\\lambda_{l,a})\n\n\\end{align}</math>\n\nThus, the likelihood is defined as\n\n<math>\\begin{align}\n\nP(\\mathbf{x}|\\lambda) &= \\frac{\\exp(S(\\mathbf{x}|\\boldsymbol{\\lambda}))}{Z(\\boldsymbol{\\lambda})}\n\n\\end{align}</math>\n\nand\n\n<math>\\begin{align}\n\n\\log P(\\mathbf{x}|\\lambda) &= S(\\mathbf{x}|\\boldsymbol{\\lambda})) - \\log Z(\\boldsymbol{\\lambda}).\n\n\\end{align}</math>\n\n\n\n<source lang=\"java5\" enclose=\"div\">\n\npublic class PositionWeightMatrixDiffSM extends AbstractDifferentiableStatisticalModel {\n\n\tprivate double[][] parameters;// array for the parameters of the PWM in natural parameterization\n\tprivate double ess;// the equivalent sample size\n\tprivate boolean isInitialized;// if the parameters of this PWM are initialized\n\tprivate Double norm;// normalization constant, must be reset for new parameter values\n\t\n\tpublic PositionWeightMatrixDiffSM( AlphabetContainer alphabets, int length, double ess ) throws IllegalArgumentException {\n\t\tsuper( alphabets, length );\n\t\t//we allow only discrete alphabets with the same symbols at all positions\n\t\tif(!alphabets.isSimple() || !alphabets.isDiscrete()){\n\t\t\tthrow new IllegalArgumentException( \"This PWM can handle only discrete alphabets with the same alphabet at each position.\" );\n\t\t}\n\t\t//create parameter-array\n\t\tthis.parameters = new double[length][(int)alphabets.getAlphabetLengthAt( 0 )];\n\t\t//set fields\n\t\tthis.ess = ess;\n\t\tthis.isInitialized = false;\n\t\tthis.norm = null;\n\t}\n\n\t/**\n\t * @param xml\n\t * @throws NonParsableException\n\t */\n\tpublic PositionWeightMatrixDiffSM( StringBuffer xml ) throws NonParsableException {\n\t\t//super-constructor in the end calls fromXML(StringBuffer)\n\t\t//and checks that alphabet and length are set\n\t\tsuper( xml );\n\t}\n\n\t@Override\n\tpublic int getSizeOfEventSpaceForRandomVariablesOfParameter( int index ) {\n\t\t//the event space are the symbols of the alphabet\n\t\treturn parameters[0].length;\n\t}\n\n\t@Override\n\tpublic double getLogNormalizationConstant() {\n\t\t//only depends on current parameters\n\t\t//-> compute only once\n\t\tif(this.norm == null){\n\t\t\tnorm = 0.0;\n\t\t\t//sum over all sequences of product over all positions\n\t\t\t//can be re-ordered for a PWM to the product over all positions\n\t\t\t//of the sum over the symbols. In log-space the outer\n\t\t\t//product becomes a sum, the inner sum must be computed\n\t\t\t//by getLogSum(double[])\n\t\t\tfor(int i=0;i<parameters.length;i++){\n\t\t\t\tnorm += Normalisation.getLogSum( parameters[i] );\n\t\t\t}\n\t\t}\n\t\treturn norm;\n\t}\n\n\t@Override\n\tpublic double getLogPartialNormalizationConstant( int parameterIndex ) throws Exception {\n\t\t//norm computed?\n\t\tif(norm == null){\n\t\t\tgetLogNormalizationConstant();\n\t\t}\n\t\t//row and column of the parameter\n\t\t//in the PWM\n\t\tint symbol = parameterIndex%(int)alphabets.getAlphabetLengthAt( 0 );\n\t\tint position = parameterIndex/(int)alphabets.getAlphabetLengthAt( 0 );\n\t\t//partial derivation only at current position, rest is factor\n\t\treturn norm - Normalisation.getLogSum( parameters[position] ) + parameters[position][symbol];\n\t}\n\n\t@Override\n\tpublic double getLogPriorTerm() {\n\t\tdouble logPrior = 0;\n\t\tfor(int i=0;i<parameters.length;i++){\n\t\t\tfor(int j=0;j<parameters[i].length;j++){\n\t\t\t\t//prior without gamma-normalization (only depends on hyper-parameters),\n\t\t\t\t//uniform hyper-parameters (BDeu), tranformed prior density,\n\t\t\t\t//without normalization constant (getLogNormalizationConstant()*ess subtracted later)\n\t\t\t\tlogPrior += ess/alphabets.getAlphabetLengthAt( 0 ) * parameters[i][j];\n\t\t\t}\n\t\t}\n\t\treturn logPrior;\n\t}\n\n\t@Override\n\tpublic void addGradientOfLogPriorTerm( double[] grad, int start ) throws Exception {\n\t\tfor(int i=0;i<parameters.length;i++){\n\t\t\tfor(int j=0;j<parameters[i].length;j++,start++){\n\t\t\t\t//partial derivations of the logPriorTerm above\n\t\t\t\tgrad[start] = ess/alphabets.getAlphabetLengthAt( 0 );\n\t\t\t}\n\t\t}\n\t}\n\n\t@Override\n\tpublic double getESS() {\n\t\treturn ess;\n\t}\n\n\t@Override\n\tpublic void initializeFunction( int index, boolean freeParams, DataSet[] data, double[][] weights ) throws Exception {\n\t\tif(!data[index].getAlphabetContainer().checkConsistency( alphabets ) || \n\t\t\t\tdata[index].getElementLength() != length){\n\t\t\tthrow new IllegalArgumentException( \"Alphabet or length to not match.\" );\n\t\t}\n\t\t//initially set pseudo-counts\n\t\tfor(int i=0;i<parameters.length;i++){\n\t\t\tArrays.fill( parameters[i], ess/alphabets.getAlphabetLengthAt( 0 ) );\n\t\t}\n\t\t//counts in data\n\t\tfor(int i=0;i<data[index].getNumberOfElements();i++){\n\t\t\tSequence seq = data[index].getElementAt( i );\n\t\t\tfor(int j=0;j<seq.getLength();j++){\n\t\t\t\tparameters[j][ seq.discreteVal( j ) ] += weights[index][i];\n\t\t\t}\n\t\t}\n\t\tfor(int i=0;i<parameters.length;i++){\n\t\t\t//normalize -> MAP estimation\n\t\t\tNormalisation.sumNormalisation( parameters[i] );\n\t\t\t//parameters are log-probabilities from MAP estimation\n\t\t\tfor(int j=0;j<parameters[i].length;j++){\n\t\t\t\tparameters[i][j] = Math.log( parameters[i][j] );\n\t\t\t}\n\t\t}\n\t\tnorm = null;\n\t\tisInitialized = true;\n\t}\n\n\t@Override\n\tpublic void initializeFunctionRandomly( boolean freeParams ) throws Exception {\n\t\tint al = (int)alphabets.getAlphabetLengthAt( 0 );\n\t\t//draw parameters from prior density -> Dirichlet\n\t\tDirichletMRGParams pars = new DirichletMRGParams( ess/al, al );\n\t\tfor(int i=0;i<parameters.length;i++){\n\t\t\tparameters[i] = DirichletMRG.DEFAULT_INSTANCE.generate( al, pars );\n\t\t\t//parameters are log-probabilities\n\t\t\tfor(int j=0;j<parameters[i].length;j++){\n\t\t\t\tparameters[i][j] = Math.log( parameters[i][j] );\n\t\t\t}\n\t\t}\n\t\tnorm = null;\n\t\tisInitialized = true;\n\t}\n\t\n\n\t@Override\n\tpublic double getLogScoreFor( Sequence seq, int start ) {\n\t\tdouble score = 0.0;\n\t\t//log-score is sum of parameter values used\n\t\t//normalization to likelihood can be achieved\n\t\t//by subtracting getLogNormalizationConstant\n\t\tfor(int i=0;i<parameters.length;i++){\n\t\t\tscore += parameters[i][ seq.discreteVal( i+start ) ];\n\t\t}\n\t\treturn score;\n\t}\n\n\t@Override\n\tpublic double getLogScoreAndPartialDerivation( Sequence seq, int start, IntList indices, DoubleList partialDer ) {\n\t\tdouble score = 0.0;\n\t\tint off = 0;\n\t\tfor(int i=0;i<parameters.length;i++){\n\t\t\tint v = seq.discreteVal( i+start );\n\t\t\tscore += parameters[i][ v ];\n\t\t\t//add index of parameter used to indices\n\t\t\tindices.add( off + v );\n\t\t\t//derivations are just one\n\t\t\tpartialDer.add( 1 );\n\t\t\toff += parameters[i].length;\n\t\t}\n\t\treturn score;\n\t}\n\n\t@Override\n\tpublic int getNumberOfParameters() {\n\t\tint num = 0;\n\t\tfor(int i=0;i<parameters.length;i++){\n\t\t\tnum += parameters[i].length;\n\t\t}\n\t\treturn num;\n\t}\n\n\t@Override\n\tpublic double[] getCurrentParameterValues() throws Exception {\n\t\tdouble[] pars = new double[getNumberOfParameters()];\n\t\tfor(int i=0,k=0;i<parameters.length;i++){\n\t\t\tfor(int j=0;j<parameters[i].length;j++,k++){\n\t\t\t\tpars[k] = parameters[i][j];\n\t\t\t}\n\t\t}\n\t\treturn pars;\n\t}\n\n\t@Override\n\tpublic void setParameters( double[] params, int start ) {\n\t\tfor(int i=0;i<parameters.length;i++){\n\t\t\tfor(int j=0;j<parameters[i].length;j++,start++){\n\t\t\t\tparameters[i][j] = params[start];\n\t\t\t}\n\t\t}\n\t\tnorm = null;\n\t}\n\n\t@Override\n\tpublic String getInstanceName() {\n\t\treturn \"Position weight matrix\";\n\t}\n\n\n\t@Override\n\tpublic boolean isInitialized() {\n\t\treturn isInitialized;\n\t}\n\n\t@Override\n\tpublic StringBuffer toXML() {\n\t\tStringBuffer xml = new StringBuffer();\n\t\t//store all fields with XML parser\n\t\t//including alphabet and length of the super-class\n\t\tXMLParser.appendObjectWithTags( xml, alphabets, \"alphabets\" );\n\t\tXMLParser.appendObjectWithTags( xml, length, \"length\" );\n\t\tXMLParser.appendObjectWithTags( xml, parameters, \"parameters\" );\n\t\tXMLParser.appendObjectWithTags( xml, isInitialized, \"isInitialized\" );\n\t\tXMLParser.appendObjectWithTags( xml, ess, \"ess\" );\n\t\tXMLParser.addTags( xml, \"PWM\" );\n\t\treturn xml;\n\t}\n\n\t@Override\n\tprotected void fromXML( StringBuffer xml ) throws NonParsableException {\n\t\txml = XMLParser.extractForTag( xml, \"PWM\" );\n\t\t//extract all fields\n\t\talphabets = (AlphabetContainer)XMLParser.extractObjectForTags( xml, \"alphabets\" );\n\t\tlength = XMLParser.extractObjectForTags( xml, \"length\", int.class );\n\t\tparameters = (double[][])XMLParser.extractObjectForTags( xml, \"parameters\" );\n\t\tisInitialized = XMLParser.extractObjectForTags( xml, \"isInitialized\", boolean.class );\n\t\tess = XMLParser.extractObjectForTags( xml, \"ess\", double.class );\n\t}\n\n</source>"
                    }
                ]
            },
            "40": {
                "pageid": 40,
                "ns": 0,
                "title": "SHMM",
                "revisions": [
                    {
                        "contentformat": "text/x-wiki",
                        "contentmodel": "wikitext",
                        "*": "__NOTOC__\nby Michael Seifert, Jens Keilwagen, Marc Strickert, and Ivo Grosse\n\n== Description ==\n=== Motivation ===\nArray-based analysis of chromatin immunoprecipitation (ChIP-chip) data is a powerful technique for identifying DNA target regions of individual transcription factors. The identification of these target regions from comprehensive promoter array ChIP-chip data is challenging. Here, three approaches for the identification of transcription factor target genes from promoter array ChIP-chip data are presented. We compare (i) a standard log-fold-change analysis (LFC); (ii) a basic method based on a Hidden Markov Model (HMM); and (iii) a new extension of the HMM approach to an HMM with scaled transition matrices (SHMM) that incorporates information about the relative orientation of adjacent gene pairs on DNA. \n\n=== Results ===\nAll three methods are applied to different promoter array ChIP-chip datasets of the yeast Saccharomyces cerevisiae and the important model plant Arabidopsis thaliana to compare the prediction of transcription factor target genes. In the context of the yeast cell cycle, common target genes bound by the transcription factors ACE2 and SWI5, and ACE2 and FKH2 are identified and evaluated using the Saccharomyces Genome Database. Regarding A.thaliana, target genes of the seed-specific transcription factor ABI3 are predicted and evaluate based on publicly available gene expression profiles and transient assays performed in the wet laboratory experiments. The application of the novel SHMM to these two different promoter array ChIP-chip datasets leads to an improved identification of transcription factor target genes in comparison to the two standard approaches LFC and HMM.\n== Paper ==\nThe paper [http://bioinformatics.oxfordjournals.org/content/25/16/2118 '''''Utilizing gene pair orientations for HMM-based analysis of promoter array ChIP-chip data'''''] has been published in [http://bioinformatics.oxfordjournals.org/ Bioinformatics].\n\n== Download ==\n* [https://imbcloud.medizin.tu-dresden.de/sharing/7JRFhqEPA Supplementary data]: Link to the implementations of LFC, HMM and SHMM.\n\n== Related Projects ==\n* [[ARHMM]]: integrating local chromosomal dependencies into the analysis of tumor expression profiles\n* [[PHHMM]]: improved analysis of Array-CGH data\n* [[DSHMM]]: exploiting prior knowledge and gene distances in the analysis of tumor expression profiles\n* [[MeDIP-HMM]]: HMM-based analysis of DNA methylation profiles\n* [https://sites.google.com/site/mseifertweb/hmm-book HMM Book]: Hidden Markov Models with Applications in Computational Biology\n\n== Follow Me ==\n* [https://sites.google.com/site/mseifertweb/home Personal Homepage]"
                    }
                ]
            }
        }
    }
}