Randomize Treatments

From MagnetoWiki
Revision as of 15:57, 9 April 2013 by Houpt (talk | contribs) (created page)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

A quick bit of Scheme/Racket to produce a list of randomized treatments across a group of subjects.

Usage:

(randomize-treatments #:list treatments #:forSubjectCount number-of-subjects)

given a list of treatments and an integer number of subjects, call randomize-treatments:

> (define treatments '(drug1 drug2 drug3 drug4))
> (define number-of-subjects 6)
> (randomize-treatments #:list treatments #:forSubjectCount number-of-subjects)
6	drug2	drug1	drug3	drug4
5	drug3	drug4	drug2	drug1
4	drug3	drug2	drug1	drug4
3	drug1	drug4	drug3	drug2
2	drug2	drug3	drug4	drug1
1	drug4	drug2	drug3	drug1
done
>


Here is the racket file, randomize-treatments.rkt. The source listing is below.

#lang racket

; randomize-treatments 
; given a list of treatments and a number of subjects, 
; prints out a list of treatments for each subject

; see usage example at bottom

(define shuffle ; Returns a randomly re-ordered copy of list.
  (lambda (list)
    (if (< (length list) 2) 
        list
        (let ((item (list-ref list (random (length list)))))
          (cons item (shuffle (remove item list)))))))

(define display-list-with-tabs; prints a list with tabs between members
  (lambda (list)
    (if (> (length list) 0)
        (begin
          (display (car list))
          (if (> (length (cdr list)) 0) 
              (display "\t") 
              #f)
          (display-list-with-tabs (cdr list)))
        (displayln "")
        )))
        
               
(define randomize-treatments 
  ; given a list of treatments and a number of subjects, 
  ; prints out a list of treatments for each subject
  (lambda (#:list rx-list #:forSubjectCount n )
    (if (> n 0)
        (begin 
          (display n)(display "\t")
          (display-list-with-tabs (shuffle rx-list))
          (randomize-treatments #:list rx-list #:forSubjectCount (sub1 n)))
        (displayln 'done)
        )))

; usage
;(define treatments '(drug1 drug2 drug3 drug4))
;(define number-of-subjects 6)
;(randomize-treatments #:list treatments #:forSubjectCount number-of-subjects)