Child of Language Drift
Do you have questions or comments about this model? Ask them here! (You'll first need to log in.)
WHAT IS IT?
This model demonstrates that language shifts can arise from a very simple model of noisy statistical learning. In this model, a group of adults speak a language, each learning from the other adults. Over time, language shifts occur in the overall language of the population. In this model, adults are placed on a network and communicate only with their network neighbors.
HOW IT WORKS
Agents are adults.
At each tick, adults listen to other adults, learning a new version of the language (represented as a vowel sound in the form of an F1,F2 value-pair). Each adult replaces their old language with the new one after everyone is done listening.
Adults update their language according to the chosen learning method (switches 'method-mean?', etc.), which correspond to simple statistical learning options; they learn from a set of adults constrained by the chosen locality setting (switches 'learn-subset?', etc.).
HOW TO USE IT
The sliders for 'start-f1', 'start-f2', 'population-size', 'noise-level', and 'lifespan' set the initial values of these factors for the 'setup' button. The 'network-clustered?' and 'network-lattice?' switches are used to choose the network structure prior to setup. The 'average-node-degree' slider controls the link density of the clustered network. The 'link-chance' slider controls the link density for the lattice network.
The switches for 'learn-subset?', 'learn-local?', 'learn-nearest?' constrain the adults each child can listen to. Only 'learn-local?' should be used for this network model.
The switches for 'method-mean?', 'method-median?', 'method-one?' choose the statistical learning method of the children; only one should be 'on' per model run.
The view shows the network structure of the adults, which is not itself informative; instead, there is an array of statistical plots provided to monitor the state of the language and how it is changing over time.
THINGS TO NOTICE
Notice the trajectory of the mean F1 and F2, as well as the changing position of the values cluster on the vowel space plot.
THINGS TO TRY
Try varying the noise level within the low regime (0.01, 0.1) and at more extreme values (> 0.3); notice the effect on the mean trajectories and the vowel space plot.
Try varying the average node degree of the clustered network, and compare the effect of this to the effect of varying the link chance of the lattice network.
Comments and Questions
;; swtiches: learn-subset?,learn-local?,learn-nearest?,method-mean?,method-median?,method-one? ;; sliders: learn-subset,learn-radius breed [adults adult] breed [children child] adults-own [f1 f2 tempf1 tempf2 my-lifespan age my-group] ;children-own [f1 f2 my-group] to setup clear-all ; create-children population-size [ ; ; children start with no language ; set color blue ; set ycor random-ycor ; set xcor random-xcor ; ] ; only one can be chosen if network-clustered? [setup-cluster-network] if network-lattice? [setup-lattice-network] reset-ticks end to go ;; Run one generation (tick) ask adults [ set my-group adults ;; default to all adults ;; none of these are intended to work together, though they theoretically could if learn-local? [set my-group link-neighbors] ;; all adults neighbors ;; if learn-radius is set too small, too many children die isolated to graduate to fill dying adult slots. problem :/ ;if learn-subset? [set my-group n-of learn-subset my-group] ;; random N of adults ;if learn-nearest? [set my-group min-n-of learn-subset adults [distance myself]] ;; nearest N adults ifelse any? my-group ;; don't attempt learn if my-group is empty, instead die [listen] [ let neighbor-nodes turtle-set other adults in-radius 2 create-links-with neighbor-nodes [ if random-float 1 > link-chance [ die ] ] ] update ] ; ask adults [ ; set age age + 1 ;; increment age ; if age > my-lifespan [die] ;; die if new age exceeds my-lifespan ; ] ; ask n-of (population-size - count adults) children [ ; ; only enough children graduate to replace deaths ; set breed adults ; set color red ; ; children get lifespan upon graduation ; set my-lifespan random lifespan + 1 ; ] ; ask children [die] ; remaining children are cleaned out before 50 new created ; create-children population-size [ ; set color blue ; set ycor random-ycor ; set xcor random-xcor ; ] tick plot-vowel-space end to listen ; agent listens to all speaking agents (adults), computes idiolect ; learn-mean is one possible strategy: learn-mode ; noisy listening/learning is also possible ;; none of these are intended to interact, though it may be possible; this is still better than multiple setup buttons, because of the combinations ;; if none are picked, it's just pure noise effect if method-one? [learn-one] if method-mean? [learn-mean] if method-median? [learn-median] ; add noise as % of total (not current?) ;; this means that f2 has more absolute noise, because it's a larger value; problem? set tempf1 f1 + random-normal 0 noise-level * start-f1 set tempf2 f2 + random-normal 0 noise-level * start-f2 if f1 < 200 [set tempf1 200] if f2 < 500 [set tempf2 500] if f1 > 1200 [set tempf1 1200] if f2 > 3500 [set tempf2 3500] end to learn-mean ;;adopts mean of adults set tempf1 mean [f1] of my-group set tempf2 mean [f2] of my-group end to learn-one ;;randomly copies one adult set tempf1 one-of [f1] of my-group set tempf2 one-of [f2] of my-group end to learn-median ;;learns median of adults set tempf1 median [f1] of my-group set tempf2 median [f2] of my-group end to plot-vowel-space ask adults [ plotxy f2 f1] end to setup-cluster-network create-adults population-size / 2 [ ; initialize adult formants near start-f1,-f2 (use random-normal) ; use realistic f1 (700), f2 (2000), deviation set f1 random-normal start-f1 150 set f2 random-normal start-f2 500 set color red set ycor random-ycor set xcor random-xcor set my-lifespan random lifespan ] let num-links (average-node-degree * population-size) / 2 while [count links < num-links ] [ ask one-of adults [ let choice (min-one-of (other adults with [not link-neighbor? myself]) [distance myself]) if choice != nobody [ create-link-with choice ] ] ] ; make the network look a little prettier repeat 10 [ layout-spring adults links 0.3 (world-width / (sqrt population-size)) 1 ] end to update set f1 tempf1 set f2 tempf2 end to setup-lattice-network ; create the grid of nodes let grid-size 12 ask patches with [abs pxcor < (grid-size / 2) and abs pycor < (grid-size / 2)] [ sprout 1 [set breed adults] ] ask adults [ ; initialize adult formants near start-f1,-f2 (use random-normal) ; use realistic f1 (700), f2 (2000), deviation set f1 random-normal start-f1 150 set f2 random-normal start-f2 500 set color red ;set ycor random-ycor ;set xcor random-xcor set my-lifespan random lifespan ] ; create a directed network such that each node has a LINK-CHANCE percent chance of ; having a link established from a given node to one of its neighbors ask adults [ let neighbor-nodes turtle-set [turtles-here] of neighbors4 create-links-with neighbor-nodes [ if random-float 1 > link-chance [ die ] ] ] ; spread the nodes out ask adults [ setxy (xcor * (max-pxcor - 1) / (grid-size / 2 - 0.5)) (ycor * (max-pycor - 1) / (grid-size / 2 - 0.5)) ] end
There is only one version of this model, created about 12 years ago by Jeremy Needle.
Attached files
No files