Miind and beyond

After a few snags with a dependency that did not want to play nicely, I managed to get the MIIND simulator installed. This is required for the next step of the project.

I now need to demonstrate that as the mu increases (which we can now predict reasonably accurately), the output firing rate steadily increases. This produces a sigmoid shape on a histogram… after a fashion!

Today I ran the one population model [to test, we need to do the same with a two population model], with a variety of different rates, which equates to different mu values. The mu can also be varied by altering the synaptic weight as well, although this would be much less significant changes, and should in theory result in exactly the same curve.

Once I have done this in NEST I will need to replicate it in MIIND

Back on track

Since last week I managed to track down and resolve the problems I had been having with help from Marc. It turned out to be a quota problem; the data exceed my quota and thus overwrote parts of itself. I thought I had modified my script to do this, but evidently not. Once I had got my script using /tmp/ (and my portable hdd) instead of my home folder, everything works fine again.

I now have a working, one population model. The input and output is consistent as far as I can tell. This is something that is bothering me though, I don’t feel like I am understanding the theory as well as I should. It is certainly making my progress slow, which is frustrating. I am trying to make sense of the Amit & Brunel papers, but they’re big papers and it is all too easy to get lost n the text.

A firm grasp on the background is becoming most apparent now that I have started my final report. I will not be able to write up that section well at all unless I do.

Not so good

Yesterday was not a good day for my project; I found myself being propelled backwards from the doorstep of phase 2, ending up at the gates of phase 1, right where I started…. well sort of. It certainly felt that way.

The most significant acheivement I have made som far is confirming that I can correctly predict the properties of the output for a neuron population. The next stage is to use models with multiple populations. Before I could move on to this stage, I needed to remind myself of the tools that I had been using before.

The way to do this was to repeat the post-processing of the simulated output for the single population model. As the output files are mammoth in size, I can only store them in /tmp/. This means I had to run the simulation again as well.

Something is not right. While the size of the file is almost identical, the order of magnitude of spikes is correct, my post-processing tool was failing. Given that the output for any given model should be identical no matter how many times it is run, and that the tool worked before, this should not happen. I have modified the tool to cope with the error and produce the meaningful output.

The output I now get still fits the theoretical predictions, and so is correct. However, it is most disconcerting that it is not identical as it should be. I have yet to establish what exactly causes the NEST simulator to behave differently, or if the annomolies are due to the corrupt file. Even if that is the case, I do not know what is causing that to happen.

I will definately be mentioning this to Marc in our next meeting.

The Story So Far

So far, I have sucessfully managed to implement a one populatuion model and estimate that its behaviour is consistent. I have done this by measuring the spikes generated by the poisson generators (input of the population) and the spikes generated by the population itself (output of the population).

The results from the latter step need to be checked against theory. The formulea to do so is extremely complex and I am expecting some software from Marc to help with these calculations. I was able to calculate the input rate as these formulae are relatively simple.

I have implemented (I believe) a two population model, with both excitatory and inhibitory populations. The model has a poisson generator for each excitatory neuron. These provides the initial stimulus for the excitatory population. The excitatory and inhibitory populations each have 0.1 * the population size, random connections to other neurons (self or cross population). Each population also has a spike detector attached.

Using the same variable values as previously used for the one population model, this yielded very little activity (17 ex-spikes and 0 in-spikes). However, if the weights are tweaked upwards, I found that the excitatory population started off barely spiking, until about 40ms where its rate increased exponetially to 50000 before 50ms, after which it maintained this firing rate. The inhibitory population displayed similar behaviour but on a smaller scale (as we would expect with a smaller population).

The resulting histograms derived from these spiking data clearly show a sigmoid shape. This indicates stable regular firing, though I have yet to confirm this.

Starting out with pyNEST

pyNEST is a python extension and interface for the NEST Neural Simulation Tool. I will be using it to create my models for the NEST simulator. My first task is to get familiar with pyNEST and its features.

So far with pyNest, I have been trying out the basics; creating a single neuron (as opposed to a population of neurons), a Poisson Generator (a stochastic function) to interact with the neuron and a voltmeter to record the voltage of the neuron.

It would appear that the Poisson Generators can have several different rates which have corresponding convergence values. To begin with, I created a Poisson Generator which had just one rate. I set the initial rate to 40000.0 and a convergence value of 1.0. I then ran the simulator for one second (1000 ms) with a heuristic output. This lead to a neuron which never fired, with its membrane potential hovering around the -60mV point. Neurons need to reach aprox -55mV to fire and discharge to the rest potential rate of -70mV.

I next modified the convergence value to 2.0. This had much more satisfactory results. The neuron fired and discharged with a frequency of 45/second (45Hz). The peaks had a very uniformed structure. Increasing the convergence rate further causes the neuron to fire more frequently. Increasing it to 3.0 causes a spike frequency of 93Hz, more than double then before. A rate of 4.0 gives a frequency of 128Hz which suggests that the difference in growth is logarithmic.

I also tried altering the initial rate for the Poisson Generator. I decreased the rate from 40000 to 30000 in steps of 1000. At each step the result was less spikes within the same timeframe until 31000 where the neuron ceased to spike, between 37000 and 31000 the curves became increasingly less uniformed.

Increasing the Poisson rate increases the number of spikes. Interestingly the ratio is exactly the same as when I altered the convergence rate. Multiplying the convergence by 5 (2.0*5 = 10.0) produces 252 spikes. Doing the same to the Poisson rate (40,000 * 5 = 200,000) gives the same result.

At this point I decided to add an additional rate to the Poisson Generator. On doing so, the effects were immediately clear; a secondary rate can be used to amplify or to counteract the first by assigning positive or negative values for its convergence. I used two identical rates, with identical convergence values, the firing frequency was greatly increased. Setting the second convergence rate as the negative of the first (2.0, -2.0) causes the neuron to not fire at all. Setting the convergence rate at a lower negative value reduced the firing rate, providing the second Poisson rate is set significantly lower than the first. While I can see these effects, I can not establish exactly why we would do this.

  1. What are the values being put into SetStatus() for the voltmeter and why are they required?
  2. What is the final argument given in ConvergentConnect()? Only positive numbers, seems to offset the initial state of the neuron
  3. Why would we use multiple rates in the Poisson Generator?
  4. Is there any documentation for pyNEST?