## 696 0.0000000 0.00000 Summer 7 Environmental 0
## 697 55.0000000 273.00000 Summer 7 Foodborne 1
## 698 20.0000000 760.00000 Winter 1 Unspecified 0
## 699 0.0000000 0.00000 Spring 5 Person to Person 0
## 700 55.4770318 283.00000 Spring 3 Unknown 0
## 701 28.6725664 565.00000 Spring 4 Foodborne 0
## 702 0.0000000 0.00000 Winter 1 Person to Person 1
## 703 0.0000000 0.00000 Summer 7 Environmental 0
## 704 51.6853933 356.00000 Spring 3 Foodborne 0
## 705 0.0000000 0.00000 Spring 5 Foodborne 1
## 706 33.0000000 563.63636 Summer 8 Unspecified 1
## 707 0.0000000 0.00000 Winter 12 Person to Person 1
## 708 37.5245580 509.00000 Fall 11 Foodborne 1
## 709 8.0000000 2500.00000 Winter 1 Environmental 0
## 710 0.0000000 0.00000 Fall 11 Foodborne 0
## 711 0.0000000 0.00000 Winter 7 Unspecified 0
## 712 36.3636364 550.00000 Fall 9 Unspecified 1
## 713 24.8470012 817.00000 Spring 3 Foodborne 0
## 714 49.0000000 500.00000 Spring 3 Foodborne 1
## 715 27.8941566 907.00000 Fall 10 Person to Person 1
## 716 0.0000000 0.00000 Spring 4 Person to Person 0
## 717 0.0000000 0.00000 Spring 4 Unspecified 0
## 718 20.3956344 1466.00000 Winter 12 Unknown 0
## 719 31.2500000 960.00000 Fall 10 Environmental 0
## 720 13.6363636 2200.00000 Winter 12 Environmental 0
## 721 0.0000000 0.00000 Spring 5 Foodborne 1
## 722 11.5793331 2729.00000 Winter 12 Person to Person 0
## 723 40.8291457 796.00000 Spring 4 Unknown 0
## 724 0.0000000 0.00000 Summer 8 Foodborne 0
## 725 4.1555116 8591.00000 Winter 12 Person to Person 0
## 726 12.6153846 2925.00000 Fall 10 Foodborne 0
## 727 0.0000000 0.00000 Winter 2 Environmental 0
## 728 0.0000000 0.00000 Winter 12 Unspecified 0
## 729 0.0000000 0.00000 Spring 4 Person to Person 1
## 730 0.0000000 0.00000 Winter 1 Environmental 1
## 731 9.8182884 13648.00000 Spring 3 Unknown 1
## 732 0.0000000 0.00000 Winter 1 Environmental 1
## 733 44.0000000 4200.00000 Fall 9 Person to Person 1
## 734 13.3333333 15000.00000 Spring 4 Environmental 0
## 735 38.0000000 7169.00000 Spring 4 Foodborne 1
## 736 0.0000000 0.00000 Summer 1 Unspecified 0
## 737 72.0000000 10000.00000 Fall 11 Environmental 0
## 738 0.0000000 0.00000 Winter 12 Foodborne 1
## 739 NA NA Winter 2 Foodborne 0
## 740 NA NA Winter 1 Foodborne 0
## 741 NA NA Spring 3 Person to Person 0
## 742 NA NA Winter 11 Person to Person 0
## 743 NA NA Winter 1 Foodborne 0
## 744 33.3333333 6.00000 Winter 7 Foodborne 1
## 745 0.0000000 0.00000 Fall 9 Foodborne 1
## 746 NA NA Winter 1 Foodborne 0
## 747 11.1111111 36.00000 Winter 12 Unspecified 1
## 748 0.0000000 0.00000 Summer 1 Foodborne 1
## 749 0.0000000 0.00000 Winter 1 Environmental 1
## 750 75.0000000 8.00000 Winter 2 Person to Person 1
## 751 0.0000000 0.00000 Summer 7 Person to Person 0
## 752 10.0000000 80.00000 Summer 7 Unknown 1
## 753 22.8571429 35.00000 Winter 1 Unspecified 1
## 754 81.8181818 11.00000 Spring 4 Person to Person 1
## 755 50.0000000 18.00000 Spring 5 Foodborne 1
## 756 NA NA Winter 1 Foodborne 0
## 757 15.1515151 66.00000 Fall 11 Foodborne 0
## 758 NA NA Winter 1 Foodborne 0
## 759 40.0000000 30.00000 Summer 8 Foodborne 1
## 760 80.0000000 15.00000 Summer 6 Foodborne 0
## 761 12.1495327 107.00000 Winter 12 Environmental 1
## 762 43.0000000 30.00000 Winter 1 Person to Person 1
## 763 0.0000000 0.00000 Winter 1 Unknown 1
## 764 3.7000000 351.35135 Spring 4 Unspecified 1
## 765 34.2105263 38.00000 Fall 4 Environmental 0
## 766 NA NA Winter 12 Foodborne 1
## 767 50.0000000 30.00000 Fall 10 Foodborne 1
## 768 50.0000000 30.00000 Fall 9 Foodborne 1
## 769 NA NA Winter 1 Foodborne 0
## 770 8.9000000 NA Summer 6 Environmental 1
## 771 0.0000000 0.00000 Spring 4 Unspecified 1
## 772 73.1000000 26.00000 Summer 8 Foodborne 1
## 773 74.0000000 27.00000 Spring 5 Person to Person 1
## 774 NA NA Winter 1 Foodborne 0
## 775 81.0000000 26.00000 Winter 1 Environmental 1
## 776 84.0000000 25.00000 Summer 6 Unspecified 1
## 777 58.0000000 36.00000 Winter 12 Foodborne 1
## 778 0.0000000 0.00000 Winter 1 Person to Person 1
## 779 28.0000000 80.00000 Summer 7 Unknown 1
## 780 49.0000000 122.00000 Fall 10 Person to Person 1
## 781 80.0000000 29.00000 Spring 5 Foodborne 1
## 782 NA NA Spring 4 Unspecified 1
## 783 0.0000000 0.00000 Fall 3 Unspecified 1
## 784 0.0000000 0.00000 Summer 8 Unspecified 0
## 785 NA NA Winter 1 Foodborne 0
## 786 NA NA Winter 1 Foodborne 0
## 787 70.0000000 37.00000 Fall 10 Foodborne 1
## 788 53.0000000 34.00000 Winter 2 Foodborne 1
## 789 42.0000000 61.90476 Spring 9 Person to Person 1
## 790 31.0000000 84.00000 Summer 7 Unknown 1
## 791 0.0000000 0.00000 Spring 5 Foodborne 1
## 792 85.0000000 34.00000 Winter 1 Foodborne 1
## 793 0.0000000 0.00000 Spring 5 Person to Person 1
## 794 76.3157895 38.00000 Spring 5 Unknown 1
## 795 51.7857143 56.00000 Spring 5 Unspecified 1
## 796 0.0000000 0.00000 Spring 3 Person to Person 1
## 797 24.2990654 107.00000 Fall 9 Foodborne 1
## 798 41.8918919 74.00000 Spring 3 Unspecified 1
## 799 49.0000000 41.00000 Winter 2 Foodborne 1
## 800 8.9000000 348.31461 Winter 1 Unspecified 1
## 801 0.0000000 0.00000 Summer 6 Person to Person 1
## 802 0.0000000 0.00000 Spring 10 Person to Person 0
## 803 58.0000000 53.00000 Fall 10 Person to Person 1
## 804 0.0000000 0.00000 Fall 11 Person to Person 1
## 805 39.0804598 87.00000 Spring 11 Foodborne 1
## 806 NA NA Winter 1 Foodborne 0
## 807 57.4000000 61.00000 Winter 12 Foodborne 0
## 808 43.2098765 81.00000 Winter 1 Environmental 1
## 809 10.0000000 370.00000 Spring 4 Foodborne 1
## 810 21.1111111 180.00000 Winter 1 Person to Person 1
## 811 0.0000000 0.00000 Summer 8 Foodborne 0
## 812 0.0000000 0.00000 Spring 5 Foodborne 1
## 813 17.0000000 240.00000 Summer 6 Person to Person 1
## 814 27.3000000 150.00000 Summer 7 Foodborne 1
## 815 0.0000000 0.00000 Winter 7 Unspecified 1
## 816 20.6896552 203.00000 Winter 1 Unspecified 1
## 817 11.6531165 369.00000 Winter 12 Environmental 1
## 818 32.5925926 135.00000 Fall 11 Person to Person 1
## 819 63.0000000 71.42857 Fall 11 Foodborne 1
## 820 64.2857143 70.00000 Spring 5 Environmental 1
## 821 57.9710145 69.00000 Fall 10 Foodborne 1
## 822 50.0000000 94.00000 Summer 8 Foodborne 1
## 823 23.4375000 192.00000 Spring 11 Foodborne 1
## 824 35.0000000 137.00000 Summer 6 Person to Person 0
## 825 53.0000000 NA Winter 11 Foodborne 1
## 826 NA NA Winter 1 Foodborne 0
## 827 0.0000000 0.00000 Summer 8 Foodborne 0
## 828 65.2777778 72.00000 Fall 11 Foodborne 1
## 829 14.1000000 361.00000 Fall 11 Person to Person 1
## 830 63.0000000 83.00000 Winter 12 Person to Person 1
## 831 28.0000000 189.00000 Winter 1 Environmental 1
## 832 58.0000000 95.00000 Spring 5 Foodborne 1
## 833 NA NA Spring 3 Person to Person 1
## 834 17.5000000 331.42857 Winter 12 Unspecified 1
## 835 0.0000000 0.00000 Winter 1 Person to Person 1
## 836 56.6000000 106.00000 Summer 8 Foodborne 1
## 837 0.0000000 0.00000 Spring 10 Person to Person 0
## 838 46.6544218 213.00000 Fall 11 Person to Person 1
## 839 0.0000000 0.00000 Winter 12 Person to Person 1
## 840 0.0000000 0.00000 Winter 12 Unspecified 1
## 841 NA NA Winter 1 Foodborne 0
## 842 0.0000000 0.00000 Winter 2 Person to Person 1
## 843 0.0000000 0.00000 Spring 10 Unspecified 1
## 844 49.6000000 263.00000 Winter 1 Environmental 1
## 845 0.0000000 0.00000 Spring 3 Unspecified 0
## 846 21.9000000 319.63470 Winter 1 Unknown 1
## 847 6.5604499 1067.00000 Winter 12 Person to Person 0
## 848 59.0000000 125.00000 Spring 10 Foodborne 1
## 849 0.0000000 0.00000 Winter 2 Foodborne 1
## 850 34.3750000 224.00000 Fall 11 Person to Person 1
## 851 63.4803150 194.00000 Fall 11 Foodborne 1
## 852 0.0000000 0.00000 Winter 1 Foodborne 1
## 853 20.0000000 400.00000 Summer 6 Person to Person 1
## 854 43.4065934 182.00000 Winter 8 Person to Person 1
## 855 39.3364929 211.00000 Fall 10 Person to Person 1
## 856 76.0000000 111.00000 Fall 9 Environmental 1
## 857 NA NA Summer 7 Person to Person 1
##<PHONE_NUMBER>000 163.00000 Summer 7 Environmental 1
## 859 0.0000000 0.00000 Winter 8 Foodborne 1
## 860 80.9523810 105.00000 Fall 11 Foodborne 1
## 861 12.4000000 815.00000 Winter 12 Foodborne 1
## 862 14.6000000 698.00000 Winter 2 Foodborne 1
## 863 39.0000000 266.00000 Winter 2 Environmental 1
## 864 36.0000000 284.00000 Fall 9 Unknown 1
## 865 0.0000000 0.00000 Winter 12 Person to Person 1
## 866 30.4225352 355.00000 Fall 9 Person to Person 1
## 867 55.0000000 387.00000 Winter 6 Foodborne 1
## 868 0.0000000 0.00000 Fall 11 Foodborne 1
## 869 8.8000000 1357.00000 Fall 9 Foodborne 1
## 870 6.0856865 2054.00000 Spring 3 Foodborne 1
## 871 49.0000000 257.00000 Spring 5 Person to Person 1
## 872 62.0000000 449.00000 Summer 6 Environmental 1
## 873 3.4239415 3826.00000 Fall 10 Unspecified 1
## 874 65.0000000 NA Summer 7 Environmental 1
## 875 0.0000000 0.00000 Summer 8 Environmental 1
## 876 0.0000000 0.00000 Summer 8 Foodborne 1
## 877 7.7222222 1800.00000 Fall 9 Environmental 1
## 878 67.1428571 210.00000 Summer 6 Environmental 1
## 879 NA NA Fall 10 Person to Person 1
## 880 0.0000000 0.00000 Fall 11 Foodborne 0
## 881 75.5319149 188.00000 Winter 2 Person to Person 1
## 882 2.5242718 6180.00000 Fall 11 Unspecified 1
## 883 13.3000000 1195.48872 Winter 12 Foodborne 0
## 884 6.0000000 2800.00000 Summer 8 Person to Person 1
## 885 0.0000000 0.00000 Fall 11 Person to Person 1
## 886 20.8805031 795.00000 Summer 2 Person to Person 1
## 887 0.0000000 0.00000 Spring 5 Foodborne 1
## 888 22.6683938 772.00000 Winter 2 Environmental 1
## 889 61.9000000 284.00000 Winter 12 Person to Person 1
## 890 52.9000000 325.00000 Winter 1 Foodborne 1
## 891 0.0000000 0.00000 Fall 11 Foodborne 1
## 892 0.0000000 0.00000 Winter 12 Foodborne 1
## 893 37.0000000 524.00000 Spring 3 Foodborne 1
## 894 11.4400000 1714.00000 Fall 10 Person to Person 1
## 895 0.0000000 0.00000 Spring 5 Environmental 1
## 896 0.0000000 0.00000 Summer 8 Environmental 1
## 897 94.0000000 414.45455 Spring 5 Foodborne 1
## 898 0.0000000 0.00000 Winter 2 Foodborne 1
## 899 23.9000000 859.00000 Summer 8 Foodborne 1
## 900 49.4145199 427.00000 Winter 1 Environmental 1
## 901 NA NA Summer 5 Unspecified 1
## 902 0.0000000 0.00000 Winter 7 Environmental 1
## 903 60.6875000 748.00000 Summer 6 Person to Person 1
## 904 27.5000000 850.00000 Winter 1 Foodborne 1
## 905 0.0000000 0.00000 Spring 5 Environmental 1
## 906 0.0000000 0.00000 Summer 7 Environmental 1
## 907 0.0000000 0.00000 Winter 2 Person to Person 1
## 908 25.8000000 790.00000 Spring 3 Foodborne 1
## 909 0.0000000 0.00000 Spring 4 Environmental 1
## 910 0.0000000 0.00000 Winter 6 Person to Person 1
## 911 0.0000000 0.00000 Winter 2 Environmental 1
## 912 0.0000000 0.00000 Winter 1 Environmental 1
## 913 7.2000000 4500.00000 Summer 7 Person to Person 1
## 914 0.0000000 0.00000 Winter 12 Foodborne 1
## 915 0.0000000 0.00000 Winter 12 Person to Person 1
## 916 44.0000000 753.00000 Winter 2 Foodborne 1
## 917 0.0000000 0.00000 Summer 7 Environmental 1
## 918 52.5925926 675.00000 Winter 1 Person to Person 1
## 919 28.1347962 1276.00000 Spring 5 Person to Person 1
## 920 55.0000000 672.00000 Spring 3 Environmental 1
## 921 12.6153846 2925.00000 Fall 9 Foodborne 1
## 922 0.0000000 0.00000 Spring 5 Person to Person 1
## 923 16.6144201 1276.00000 Fall 11 Foodborne 0
## 924 60.9600000 625.00000 Winter 1 Foodborne 1
## 925 10.4249142 3789.00000 Summer 7 Unspecified 1
## 926 10.4249142 3789.00000 Summer 7 Person to Person 0
## 927 0.0000000 0.00000 Summer 6 Foodborne 0
## 928 24.0000000 1744.00000 Fall 11 Foodborne 1
## 929 9.0000000 4500.00000 Summer 8 Person to Person 1
## 930 25.0000000 1732.00000 Summer 6 Environmental 1
## 931 0.0000000 0.00000 Winter 12 Environmental 1
## 932 18.1855333 2447.00000 Winter 12 Person to Person 1
## 933 0.0000000 0.00000 Winter 2 Environmental 1
## 934 11.6597725 3868.00000 Fall 11 Unknown 1
## 935 9.0702087 5270.00000 Fall 9 Unknown 1
## 936 38.4375000 1280.00000 Fall 11 Unspecified 1
## 937 9.6287531 6761.00000 Fall 11 Foodborne 0
## 938 33.4000000 NA Fall 10 Person to Person 1
## 939 44.2000000 1492.00000 Fall 11 Foodborne 1
## 940 9.4445935 7454.00000 Fall 10 Person to Person 0
## 941 0.0000000 0.00000 Fall 10 Unspecified 1
## 942 0.0000000 0.00000 Winter 1 Environmental 1
## 943 20.8545495 4517.00000 Winter 1 Environmental 1
## 944 2.7914286 35000.00000 Winter 2 Person to Person 1
## 945 4.8708333 24000.00000 Fall 9 Person to Person 1
## 946 17.0000000 6985.00000 Fall 9 Person to Person 1
## 947 NA NA Summer 5 Environmental 1
## 948 20.9671180 2585.00000 Winter 2 Environmental 1
## 949 10.0000000 16990.00000 Summer 8 Environmental 1
## 950 0.0000000 0.00000 Spring 5 Environmental 0
## 951 NA NA Spring 4 Unspecified 0
## 952 NA NA <NA> NA <NA> NA
## Setting
## 1 Other
## 2 Other
## 3 Other
## 4 Other
## 5 Other
## 6 Other
## 7 Other
## 8 Other
## 9 Other
## 10 Other
## 11 Other
## 12 Other
## 13 Other
## 14 Other
## 15 Other
## 16 Other
## 17 Other
## 18 Other
## 19 Other
## 20 Other
## 21 Other
## 22 Other
## 23 Other
## 24 Other
## 25 Other
## 26 Restaurant
## 27 Restaurant
## 28 Other
## 29 Other
## 30 Other
## 31 Restaurant
## 32 Other
## 33 Other
## 34 Other
## 35 Restaurant
## 36 Other
## 37 Restaurant
## 38 Restaurant
## 39 Other
## 40 Other
## 41 Other
## 42 Restaurant
## 43 Other
## 44 Other
## 45 Other
## 46 Other
## 47 Other
## 48 Other
## 49 Other
## 50 Other
## 51 Other
## 52 Other
## 53 Other
## 54 Other
## 55 Restaurant
## 56 Other
## 57 Other
## 58 Other
## 59 Other
## 60 Restaurant
## 61 Other
## 62 Other
## 63 Other
## 64 Other
## 65 Other
## 66 Other
## 67 Restaurant
## 68 Other
## 69 Other
## 70 Other
## 71 Restaurant
## 72 Other
## 73 Other
## 74 Restaurant
## 75 Restaurant
## 76 Restaurant
## 77 Other
## 78 Restaurant
## 79 Other
## 80 Restaurant
## 81 Restaurant
## 82 Other
## 83 Other
## 84 Other
## 85 Other
## 86 Other
## 87 Other
## 88 Other
## 89 Other
## 90 Other
## 91 Other
## 92 Restaurant
## 93 Other
## 94 Other
## 95 Other
## 96 Other
## 97 Other
## 98 Other
## 99 Restaurant
## 100 Other
## 101 Other
## 102 Other
## 103 Restaurant
## 104 Other
## 105 Other
## 106 Other
## 107 Other
## 108 Other
## 109 Other
## 110 Other
## 111 Other
## 112 Other
## 113 Restaurant
## 114 Restaurant
## 115 Other
## 116 Other
## 117 Other
## 118 Other
## 119 Other
## 120 Restaurant
## 121 Restaurant
## 122 Restaurant
## 123 Restaurant
## 124 Other
## 125 Other
## 126 Other
## 127 Restaurant
## 128 Other
## 129 Restaurant
## 130 Other
## 131 Other
## 132 Other
## 133 Other
## 134 Other
## 135 Other
## 136 Restaurant
## 137 Other
## 138 Restaurant
## 139 Other
## 140 Other
## 141 Other
## 142 Other
## 143 Other
## 144 Restaurant
## 145 Restaurant
## 146 Other
## 147 Other
## 148 Other
## 149 Other
## 150 Other
## 151 Other
## 152 Other
## 153 Other
## 154 Other
## 155 Restaurant
## 156 Other
## 157 Other
## 158 Other
## 159 Other
## 160 Restaurant
## 161 Restaurant
## 162 Other
## 163 Restaurant
## 164 Restaurant
## 165 Restaurant
## 166 Other
## 167 Other
## 168 Other
## 169 Other
## 170 Restaurant
## 171 Restaurant
## 172 Other
## 173 Other
## 174 Other
## 175 Other
## 176 Other
## 177 Other
## 178 Other
## 179 Restaurant
## 180 Other
## 181 Other
## 182 Other
## 183 Restaurant
## 184 Restaurant
## 185 Restaurant
## 186 Other
## 187 Other
## 188 Restaurant
## 189 Restaurant
## 190 Other
## 191 Other
## 192 Restaurant
## 193 Restaurant
## 194 Restaurant
## 195 Restaurant
## 196 Other
## 197 Other
## 198 Other
## 199 Restaurant
## 200 Other
## 201 Other
## 202 Other
## 203 Other
## 204 Other
## 205 Restaurant
## 206 Restaurant
## 207 Restaurant
## 208 Other
## 209 Other
## 210 Other
## 211 Restaurant
## 212 Other
## 213 Other
## 214 Other
## 215 Other
## 216 Other
## 217 Restaurant
## 218 Other
## 219 Other
## 220 Other
## 221 Other
## 222 Other
## 223 Other
## 224 Other
## 225 Restaurant
## 226 Other
## 227 Restaurant
## 228 Restaurant
## 229 Other
## 230 Other
## 231 Restaurant
## 232 Other
## 233 Restaurant
## 234 Other
## 235 Other
## 236 Other
## 237 Other
## 238 Other
## 239 Other
## 240 Other
## 241 Other
## 242 Restaurant
## 243 Restaurant
## 244 Other
## 245 Other
## 246 Other
## 247 Restaurant
## 248 Restaurant
## 249 Restaurant
## 250 Other
## 251 Other
## 252 Other
## 253 Other
## 254 Restaurant
## 255 Other
## 256 Restaurant
## 257 Restaurant
## 258 Restaurant
## 259 Other
## 260 Restaurant
## 261 Other
## 262 Other
## 263 Other
## 264 Other
## 265 Restaurant
## 266 Other
## 267 Other
## 268 Other
## 269 Other
## 270 Other
## 271 Other
## 272 Restaurant
## 273 Other
## 274 Other
## 275 Restaurant
## 276 Other
## 277 Restaurant
## 278 Other
## 279 Other
## 280 Restaurant
## 281 Other
## 282 Restaurant
## 283 Other
## 284 Other
## 285 Other
## 286 Other
## 287 Other
## 288 Other
## 289 Restaurant
## 290 Other
## 291 Restaurant
## 292 Restaurant
## 293 Other
## 294 Other
## 295 Other
## 296 Other
## 297 Other
## 298 Other
## 299 Other
## 300 Other
## 301 Other
## 302 Other
## 303 Restaurant
## 304 Other
## 305 Other
## 306 Restaurant
## 307 Other
## 308 Other
## 309 Restaurant
## 310 Other
## 311 Other
## 312 Other
## 313 Other
## 314 Other
## 315 Other
## 316 Other
## 317 Other
## 318 Restaurant
## 319 Restaurant
## 320 Restaurant
## 321 Restaurant
## 322 Restaurant
## 323 Other
## 324 Other
## 325 Restaurant
## 326 Restaurant
## 327 Restaurant
## 328 Other
## 329 Other
## 330 Restaurant
## 331 Other
## 332 Other
## 333 Other
## 334 Other
## 335 Other
## 336 Other
## 337 Other
## 338 Other
## 339 Restaurant
## 340 Other
## 341 Other
## 342 Other
## 343 Other
## 344 Other
## 345 Other
## 346 Other
## 347 Restaurant
## 348 Other
## 349 Other
## 350 Other
## 351 Other
## 352 Restaurant
## 353 Other
## 354 Other
## 355 Restaurant
## 356 Other
## 357 Other
## 358 Other
## 359 Other
## 360 Restaurant
## 361 Restaurant
## 362 Other
## 363 Other
## 364 Other
## 365 Restaurant
## 366 Restaurant
## 367 Other
## 368 Other
## 369 Other
## 370 Other
## 371 Other
## 372 Other
## 373 Other
## 374 Restaurant
## 375 Restaurant
## 376 Restaurant
## 377 Other
## 378 Other
## 379 Restaurant
## 380 Other
## 381 Restaurant
## 382 Other
## 383 Other
## 384 Other
## 385 Other
## 386 Restaurant
## 387 Other
## 388 Other
## 389 Other
## 390 Other
## 391 Restaurant
## 392 Other
## 393 Restaurant
## 394 Other
## 395 Other
## 396 Restaurant
## 397 Other
## 398 Restaurant
## 399 Other
## 400 Restaurant
## 401 Other
## 402 Other
## 403 Other
## 404 Other
## 405 Other
## 406 Other
## 407 Other
## 408 Other
## 409 Restaurant
## 410 Other
## 411 Restaurant
## 412 Other
## 413 Restaurant
## 414 Other
## 415 Other
## 416 Other
## 417 Other
## 418 Other
## 419 Other
## 420 Other
## 421 Other
## 422 Other
## 423 Other
## 424 Other
## 425 Other
## 426 Other
## 427 Restaurant
## 428 Other
## 429 Other
## 430 Other
## 431 Other
## 432 Other
## 433 Other
## 434 Other
## 435 Other
## 436 Other
## 437 Other
## 438 Other
## 439 Other
## 440 Other
## 441 Other
## 442 Other
## 443 Other
## 444 Other
## 445 Other
## 446 Other
## 447 Other
## 448 Other
## 449 Other
## 450 Other
## 451 Other
## 452 Other
## 453 Other
## 454 Other
## 455 Other
## 456 Other
## 457 Other
## 458 Other
## 459 Other
## 460 Other
## 461 Other
## 462 Other
## 463 Other
## 464 Other
## 465 Other
## 466 Restaurant
## 467 Restaurant
## 468 Other
## 469 Other
## 470 Other
## 471 Other
## 472 Restaurant
## 473 Restaurant
## 474 Restaurant
## 475 Other
## 476 Other
## 477 Other
## 478 Other
## 479 Restaurant
## 480 Restaurant
## 481 Other
## 482 Restaurant
## 483 Other
## 484 Other
## 485 Restaurant
## 486 Other
## 487 Restaurant
## 488 Restaurant
## 489 Other
## 490 Other
## 491 Other
## 492 Other
## 493 Other
## 494 Other
## 495 Restaurant
## 496 Other
## 497 Restaurant
## 498 Other
## 499 Other
## 500 Other
## 501 Restaurant
## 502 Other
## 503 Restaurant
## 504 Restaurant
## 505 Other
## 506 Other
## 507 Other
## 508 Restaurant
## 509 Other
## 510 Other
## 511 Other
## 512 Other
## 513 Other
## 514 Other
## 515 Other
## 516 Restaurant
## 517 Other
## 518 Other
## 519 Other
## 520 Other
## 521 Restaurant
## 522 Other
## 523 Restaurant
## 524 Restaurant
## 525 Other
## 526 Other
## 527 Other
## 528 Other
## 529 Other
## 530 Other
## 531 Other
## 532 Restaurant
## 533 Other
## 534 Other
## 535 Other
## 536 Other
## 537 Other
## 538 Restaurant
## 539 Other
## 540 Other
## 541 Other
## 542 Other
## 543 Other
## 544 Restaurant
## 545 Other
## 546 Other
## 547 Restaurant
## 548 Restaurant
## 549 Other
## 550 Restaurant
## 551 Other
## 552 Other
## 553 Other
## 554 Restaurant
## 555 Other
## 556 Other
## 557 Other
## 558 Other
## 559 Restaurant
## 560 Other
## 561 Restaurant
## 562 Other
## 563 Other
## 564 Other
## 565 Other
## 566 Other
## 567 Other
## 568 Restaurant
## 569 Other
## 570 Other
## 571 Other
## 572 Restaurant
## 573 Other
## 574 Other
## 575 Restaurant
## 576 Restaurant
## 577 Other
## 578 Other
## 579 Restaurant
## 580 Restaurant
## 581 Other
## 582 Restaurant
## 583 Other
## 584 Restaurant
## 585 Other
## 586 Other
## 587 Other
## 588 Other
## 589 Other
## 590 Other
## 591 Other
## 592 Restaurant
## 593 Other
## 594 Other
## 595 Restaurant
## 596 Other
## 597 Other
## 598 Other
## 599 Other
## 600 Restaurant
## 601 Other
## 602 Other
## 603 Other
## 604 Other
## 605 Other
## 606 Other
## 607 Other
## 608 Other
## 609 Other
## 610 Other
## 611 Other
## 612 Other
## 613 Restaurant
## 614 Other
## 615 Other
## 616 Other
## 617 Restaurant
## 618 Other
## 619 Other
## 620 Other
## 621 Restaurant
## 622 Other
## 623 Other
## 624 Restaurant
## 625 Other
## 626 Other
## 627 Other
## 628 Other
## 629 Other
## 630 Other
## 631 Other
## 632 Restaurant
## 633 Other
## 634 Other
## 635 Other
## 636 Other
## 637 Other
## 638 Restaurant
## 639 Other
## 640 Restaurant
## 641 Other
## 642 Other
## 643 Other
## 644 Restaurant
## 645 Other
## 646 Other
## 647 Other
## 648 Other
## 649 Other
## 650 Other
## 651 Other
## 652 Other
## 653 Other
## 654 Other
## 655 Other
## 656 Other
## 657 Other
## 658 Other
## 659 Other
## 660 Other
## 661 Other
## 662 Other
## 663 Other
## 664 Other
## 665 Other
## 666 Other
## 667 Other
## 668 Other
## 669 Other
## 670 Restaurant
## 671 Other
## 672 Other
## 673 Other
## 674 Other
## 675 Other
## 676 Other
## 677 Other
## 678 Other
## 679 Other
## 680 Other
## 681 Other
## 682 Other
## 683 Other
## 684 Other
## 685 Other
## 686 Other
## 687 Restaurant
## 688 Other
## 689 Restaurant
## 690 Other
## 691 Other
## 692 Other
## 693 Other
## 694 Other
## 695 Other
## 696 Other
## 697 Other
## 698 Other
## 699 Other
## 700 Other
## 701 Other
## 702 Other
## 703 Other
## 704 Other
## 705 Restaurant
## 706 Other
## 707 Other
## 708 Restaurant
## 709 Other
## 710 Restaurant
## 711 Other
## 712 Other
## 713 Other
## 714 Other
## 715 Other
## 716 Other
## 717 Other
## 718 Other
## 719 Other
## 720 Other
## 721 Other
## 722 Other
## 723 Other
## 724 Restaurant
## 725 Other
## 726 Other
## 727 Other
## 728 Other
## 729 Other
## 730 Other
## 731 Other
## 732 Other
## 733 Other
## 734 Other
## 735 Other
## 736 Other
## 737 Other
## 738 Other
## 739 Other
## 740 Other
## 741 Other
## 742 Other
## 743 Other
## 744 Restaurant
## 745 Restaurant
## 746 Other
## 747 Other
## 748 Other
## 749 Other
## 750 Other
## 751 Other
## 752 Other
## 753 Other
## 754 Restaurant
## 755 Other
## 756 Other
## 757 Other
## 758 Other
## 759 Other
## 760 Other
## 761 Other
## 762 Other
## 763 Other
## 764 Other
## 765 Other
## 766 Other
## 767 Other
## 768 Restaurant
## 769 Other
## 770 Other
## 771 Other
## 772 Other
## 773 Other
## 774 Other
## 775 Other
## 776 Other
## 777 Other
## 778 Other
## 779 Other
## 780 Other
## 781 Other
## 782 Other
## 783 Other
## 784 Other
## 785 Other
## 786 Other
## 787 Other
## 788 Other
## 789 Other
## 790 Other
## 791 Other
## 792 Other
## 793 Other
## 794 Restaurant
## 795 Other
## 796 Other
## 797 Other
## 798 Other
## 799 Other
## 800 Other
## 801 Restaurant
## 802 Other
## 803 Other
## 804 Other
## 805 Other
## 806 Other
## 807 Other
## 808 Other
## 809 Other
## 810 Other
## 811 Restaurant
## 812 Other
## 813 Other
## 814 Other
## 815 Other
## 816 Other
## 817 Other
## 818 Other
## 819 Other
## 820 Other
## 821 Other
## 822 Other
## 823 Restaurant
## 824 Other
## 825 Other
## 826 Other
## 827 Other
## 828 Restaurant
## 829 Other
## 830 Other
## 831 Other
## 832 Other
## 833 Other
## 834 Other
## 835 Other
## 836 Other
## 837 Other
## 838 Other
## 839 Other
## 840 Other
## 841 Other
## 842 Other
## 843 Other
## 844 Other
## 845 Other
## 846 Other
## 847 Other
## 848 Other
## 849 Other
## 850 Other
## 851 Other
## 852 Other
## 853 Other
## 854 Other
## 855 Other
## 856 Other
## 857 Other
## 858 Other
## 859 Other
## 860 Other
## 861 Other
## 862 Other
## 863 Other
## 864 Other
## 865 Other
## 866 Other
## 867 Other
## 868 Other
## 869 Other
## 870 Other
## 871 Other
## 872 Other
## 873 Other
## 874 Other
## 875 Other
## 876 Other
## 877 Other
## 878 Other
## 879 Other
## 880 Other
## 881 Other
## 882 Other
## 883 Other
## 884 Other
## 885 Other
## 886 Other
## 887 Other
## 888 Other
## 889 Other
## 890 Other
## 891 Other
## 892 Other
## 893 Other
## 894 Other
## 895 Other
## 896 Other
## 897 Other
## 898 Other
## 899 Other
## 900 Other
## 901 Other
## 902 Other
## 903 Other
## 904 Other
## 905 Restaurant
## 906 Other
## 907 Other
## 908 Other
## 909 Other
## 910 Other
## 911 Other
## 912 Other
## 913 Other
## 914 Other
## 915 Other
## 916 Other
## 917 Other
## 918 Other
## 919 Other
## 920 Other
## 921 Other
## 922 Other
## 923 Other
## 924 Restaurant
## 925 Other
## 926 Other
## 927 Other
## 928 Other
## 929 Other
## 930 Restaurant
## 931 Other
## 932 Other
## 933 Other
## 934 Other
## 935 Other
## 936 Other
## 937 Other
## 938 Other
## 939 Restaurant
## 940 Other
## 941 Other
## 942 Other
## 943 Other
## 944 Other
## 945 Other
## 946 Other
## 947 Other
## 948 Other
## 949 Other
## 950 Other
## 951 Other
## 952 <NA>
We know our data fairly well by now, so we might not discover much new in any plots, but it’s always good to do them anyway. Let’s create a few plots showing the outcome and the predictors. We’ll start with the continuous predictors. I suggest scatter/box/violin plots with the outcome on the x-axis.
#write code that produces plots showing our outcome of interest on the x-axis and each numeric predictor on the y-axis.
#you can use the facet_wrap functionality in ggplot for it, or do it some other way.
season_vs_caseall <- data_clean %>%
ggplot(aes(x = season, y = CasesAll, color = season)) +
geom_violin() +
geom_point(alpha = 0.25) +
theme(legend.position = "none")
season_vs_deaths <- data_clean %>%
ggplot(aes(x = season, y = Deaths, color = season)) +
geom_violin() +
geom_point(alpha = 0.25) +
theme(legend.position = "none")
season_vs_hosp <- data_clean %>%
ggplot(aes(x = season, y = Hospitalizations, color = season)) +
geom_violin() +
geom_point(alpha = 0.25) +
theme(legend.position = "none")
season_vs_MeanD1 <- data_clean %>%
ggplot(aes(x = season, y = MeanD1, color = season)) +
geom_violin() +
geom_point(alpha = 0.25) +
theme(legend.position = "none")
season_vs_meani1 <- data_clean %>%
ggplot(aes(x = season, y = MeanI1, color = season)) +
geom_violin() +
geom_point(alpha = 0.25) +
theme(legend.position = "none")
season_vs_medianD1 <- data_clean %>%
ggplot(aes(x = season, y = MedianD1, color = season)) +
geom_violin() +
geom_point(alpha = 0.25) +
theme(legend.position = "none")
season_vs_mediani1 <- data_clean %>%
ggplot(aes(x = season, y = MedianI1, color = season)) +
geom_violin() +
geom_point(alpha = 0.25) +
theme(legend.position = "none")
season_vs_OByear <- data_clean %>%
ggplot(aes(x = season, y = OBYear, color = season)) +
geom_violin() +
geom_point(alpha = 0.25) +
theme(legend.position = "none")
season_vs_riskAll <- data_clean %>%
ggplot(aes(x = season, y = RiskAll, color = season)) +
geom_violin() +
geom_point(alpha = 0.25) +
theme(legend.position = "none")
grid.arrange(season_vs_caseall, season_vs_deaths, season_vs_hosp, season_vs_MeanD1, season_vs_meani1, season_vs_medianD1, season_vs_mediani1, season_vs_OByear, season_vs_riskAll, nrow = 2)
## Warning: Removed 6 rows containing non-finite values (stat_ydensity).
## Warning: Removed 6 rows containing missing values (geom_point).
## Warning: Removed 43 rows containing non-finite values (stat_ydensity).
## Warning: Removed 43 rows containing missing values (geom_point).
## Warning: Removed 43 rows containing non-finite values (stat_ydensity).
## Warning: Removed 43 rows containing missing values (geom_point).
## Warning: Removed 1 rows containing non-finite values (stat_ydensity).
## Warning: Removed 1 rows containing missing values (geom_point).
## Warning: Removed 1 rows containing non-finite values (stat_ydensity).
## Warning: Removed 1 rows containing missing values (geom_point).
## Warning: Removed 1 rows containing non-finite values (stat_ydensity).
## Warning: Removed 1 rows containing missing values (geom_point).
## Warning: Removed 1 rows containing non-finite values (stat_ydensity).
## Warning: Removed 1 rows containing missing values (geom_point).
## Warning: Removed 1 rows containing non-finite values (stat_ydensity).
## Warning: Removed 1 rows containing missing values (geom_point).
## Warning: Removed 115 rows containing non-finite values (stat_ydensity).
## Warning: Removed 115 rows containing missing values (geom_point).
Things look ok, apart from the skew in the predictors we discussed previously.
Next, let’s create plots for the categorical variables. You can use, for instance, geom_count
for it, or some other representation. If you prefer lots of tables, that’s ok too.
#write code that produces plots or tables showing our outcome of interest and each categorical predictor.
season_vs_Action1 <- data_clean %>%
ggplot(aes(x = season, y = Action1, color = season)) +
geom_count()
season_vs_Path1 <- data_clean %>%
ggplot(aes(x = season, y = Path1, color = season)) +
geom_count()
season_vs_Setting <- data_clean %>%
ggplot(aes(x = season, y = Setting, color = season)) +
geom_count()
season_vs_Hemi <- data_clean %>%
ggplot(aes(x = season, y = Hemisphere, color = season)) +
geom_count()
season_vs_Country <- data_clean %>%
ggplot(aes(x = season, y = Country, color = season)) +
geom_count()
season_vs_Trans1 <- data_clean %>%
ggplot(aes(x = season, y = Trans1, color = season)) +
geom_count()
season_vs_Season <- data_clean %>%
ggplot(aes(x = season, y = season, color = season)) +
geom_count()
season_vs_Vomit <- data_clean %>%
ggplot(aes(x = season, y = Vomit, color = season)) +
geom_count()
grid.arrange(season_vs_Action1, season_vs_Country, season_vs_Hemi, season_vs_Trans1, nrow = 2)
## Warning: Removed 2 rows containing non-finite values (stat_sum).
Looks ok. Notice the NA for vomiting. We are ok with that for now.
## [1] 952 21
## 'data.frame': 952 obs. of 21 variables:
## $ season : Factor w/ 4 levels "Fall","Spring",..: 1 1 1 2 2 2 3 4 4 4 ...
## $ Action1 : Factor w/ 3 levels "No","Unspecified",..: 2 2 2 2 2 2 2 2 2 2 ...
## $ CasesAll : int 1 1 1 1 1 1 1 1 1 1 ...
## $ Country : Factor w/ 19 levels "Australia","Brazil",..: 1 1 1 1 1 1 1 1 5 5 ...
## $ Deaths : int 0 0 0 0 0 0 0 0 0 0 ...
## $ EndMonth : int 0 0 0 0 0 0 0 0 2 2 ...
## $ gg2c4 : Factor w/ 2 levels "No","Yes": 1 1 1 1 1 1 1 1 1 2 ...
## $ Hemisphere : Factor w/ 2 levels "Northern","Southern": 2 2 2 2 2 2 2 2 1 1 ...
## $ Hospitalizations: int 0 0 0 0 0 0 0 0 0 0 ...
## $ MeanD1 : num 0 0 0 0 0 0 0 0 0 0 ...
## $ MeanI1 : int 0 0 0 0 0 0 0 0 0 0 ...
## $ MedianD1 : num 0 0 0 0 0 0 0 0 0 0 ...
## $ MedianI1 : int 0 0 0 0 0 0 0 0 0 0 ...
## $ OBYear : num 2004 2004 2004 2004 2004 ...
## $ Path1 : Factor w/ 3 levels "No","Unspecified",..: 2 2 2 2 2 2 2 2 2 2 ...
## $ RateAll : num NA NA NA NA NA NA NA NA NA NA ...
## $ RiskAll : num NA NA NA NA NA NA NA NA NA NA ...
## $ StartMonth : int 3 4 4 9 10 11 12 8 11 11 ...
## $ Trans1 : Factor w/ 5 levels "Environmental",..: 5 5 5 5 5 5 5 5 5 5 ...
## $ Vomit : int 0 0 0 0 0 0 0 0 1 1 ...
## $ Setting : Factor w/ 2 levels "Other","Restaurant": 1 1 1 1 1 1 1 1 1 1 ...
At this step, you should have a dataframe containing 952 observations, and 21 variables: 1 outcome, 12 numeric/integer predictors, and 8 factor variables. All variables should have values that are ready for analysis. The outcome should be in the 1st slot.
Let’s do data splitting again. Use caret
functions (or any other way you like) to split the data into 70/30 train/test portions.
Similar to mlr
, caret
allows you to use multiple processors at the same time. It is easy to set up, and the few lines below do the trick.
We’ll now explore fitting and training several tree-based models. We’ll also explore how including/excluding missing values and centering/scaling or not might affect the results.
To define a null model, we need to determine what performance measure we want to track. Since we now have a categorical outcome with more than 2 categories, the regular 2x2 table/confusion matrix, and measurements that rely on it don’t quite work, though many of them have versions that go beyond the 2x2 table. To keep things simple, we will use accuracy, which is simply the fraction of correct predictions. It is easy to compute, no matter how many categories we have. The null model still predicts the most frequent category. We can use that as baseline performance.
#write code that computes accuracy for a null model that always predicts the most common category
measureACC("", data_train$season)
## [1] NA
frequencies <- as.matrix(summary(data_train$season))
null_model <- max(frequencies)/length(data_train$season)
null_model
## [1] 0.4625749
You should find that the null model has an accuracy of around 0.46.
Now let’s consider single predictor models, i.e., we’ll fit the outcome to each predictor one at a time to get an idea of the importance of individual predictors. Here, our model will be a tree. I’m actually not so sure if this makes a lot of sense since a “tree” with only one predictor seems a bit silly. But I guess we can try. It’s similar to a 1-predictor GLM.
We’ll also do some parameter tuning here. Looking at the caret documentation, we find that the tuning parameter for the rpart
model (which is the tree algorithm) is called cp
. We could also find that using modelLookup("rpart")
. We could either specify a grid of values to try for cp
(we’ll use a grid below), or, for a single tuning parameter, caret
allows one to set the number of values to try and picks those values automatically. We’ll do the latter approach here.
#There is probably a nicer tidyverse way of doing this. I just couldn't think of it, so did it this way.
set.seed(1111) #makes each code block reproducible
outcomename = "season"
fitControl <- trainControl(method="repeatedcv",number=5,repeats=5) #setting CV method for caret
Npred <- ncol(data_train)-1 # number of predictors
resultmat <- data.frame(Variable = names(data_train)[-1], Accuracy = rep(0,Npred)) #store performance for each variable
for (n in 2:ncol(data_train)) #loop over each predictor. For this to work, outcome must be in 1st column
{
fit1 <- caret :: train( as.formula(paste(outcomename, "~", names(data_train)[n])) , data = data_train, method = "rpart", trControl = fitControl, na.action = na.pass, tuneLength = 10)
resultmat[n-1,2]= max(fit1$results$Accuracy)
}
## Warning in nominalTrainWorkflow(x = x, y = y, wts = weights, info =
## trainInfo, : There were missing values in resampled performance measures.
## Warning in nominalTrainWorkflow(x = x, y = y, wts = weights, info =
## trainInfo, : There were missing values in resampled performance measures.
## Warning in nominalTrainWorkflow(x = x, y = y, wts = weights, info =
## trainInfo, : There were missing values in resampled performance measures.
## Warning in nominalTrainWorkflow(x = x, y = y, wts = weights, info =
## trainInfo, : There were missing values in resampled performance measures.
## Warning in nominalTrainWorkflow(x = x, y = y, wts = weights, info =
## trainInfo, : There were missing values in resampled performance measures.
## Warning in nominalTrainWorkflow(x = x, y = y, wts = weights, info =
## trainInfo, : There were missing values in resampled performance measures.
## Warning in nominalTrainWorkflow(x = x, y = y, wts = weights, info =
## trainInfo, : There were missing values in resampled performance measures.
## Warning in nominalTrainWorkflow(x = x, y = y, wts = weights, info =
## trainInfo, : There were missing values in resampled performance measures.
## Warning in nominalTrainWorkflow(x = x, y = y, wts = weights, info =
## trainInfo, : There were missing values in resampled performance measures.
## Warning in nominalTrainWorkflow(x = x, y = y, wts = weights, info =
## trainInfo, : There were missing values in resampled performance measures.
## Warning in nominalTrainWorkflow(x = x, y = y, wts = weights, info =
## trainInfo, : There were missing values in resampled performance measures.
## Warning in nominalTrainWorkflow(x = x, y = y, wts = weights, info =
## trainInfo, : There were missing values in resampled performance measures.
## Warning in nominalTrainWorkflow(x = x, y = y, wts = weights, info =
## trainInfo, : There were missing values in resampled performance measures.
## Warning in nominalTrainWorkflow(x = x, y = y, wts = weights, info =
## trainInfo, : There were missing values in resampled performance measures.
## Warning in nominalTrainWorkflow(x = x, y = y, wts = weights, info =
## trainInfo, : There were missing values in resampled performance measures.
## Warning in nominalTrainWorkflow(x = x, y = y, wts = weights, info =
## trainInfo, : There were missing values in resampled performance measures.
## Warning in nominalTrainWorkflow(x = x, y = y, wts = weights, info =
## trainInfo, : There were missing values in resampled performance measures.
## Warning in nominalTrainWorkflow(x = x, y = y, wts = weights, info =
## trainInfo, : There were missing values in resampled performance measures.
## Warning in nominalTrainWorkflow(x = x, y = y, wts = weights, info =
## trainInfo, : There were missing values in resampled performance measures.
## Warning in nominalTrainWorkflow(x = x, y = y, wts = weights, info =
## trainInfo, : There were missing values in resampled performance measures.
## Variable Accuracy
## 1 Action1 0.4632701
## 2 CasesAll 0.4383832
## 3 Country 0.4539756
## 4 Deaths 0.4632739
## 5 EndMonth 0.6107981
## 6 gg2c4 0.4632797
## 7 Hemisphere 0.4614738
## 8 Hospitalizations 0.4620755
## 9 MeanD1 0.4665868
## 10 MeanI1 0.4659587
## 11 MedianD1 0.4605757
## 12 MedianI1 0.4611712
## 13 OBYear 0.4584639
## 14 Path1 0.4632718
## 15 RateAll 0.4533460
## 16 RiskAll 0.4629776
## 17 StartMonth 0.9040468
## 18 Trans1 0.4537102
## 19 Vomit 0.4632803
## 20 Setting 0.4632743
So it looks like most of the single predictor models don’t have accuracy much better than the null. 2 exceptions are StartMonth
and EndMonth
. Well, we would expect that the outbreak season and the month at which the outbreak started (and ended) have a strong correlation. I kept those variables here to see if that would happen and get some reassurance that our model works ok. Of course, in a real analysis, keeping those seems silly, we wouldn’t learn much from it (other than data entry appeared to have been done ok).
Anyway, now let’s fit a tree to the full model with all predictors.
set.seed(1111) #makes each code block reproducible
fitControl <- trainControl(method="repeatedcv",number=5,repeats=5)
fit1 = caret :: train(season ~ ., data=data_train, method="rpart", trControl = fitControl, na.action = na.pass, tuneLength = 10)
## Warning in nominalTrainWorkflow(x = x, y = y, wts = weights, info =
## trainInfo, : There were missing values in resampled performance measures.
## cp Accuracy Kappa AccuracySD KappaSD
## 1 0.00000000 0.9547526 0.9334881 0.01770142 0.02577859
## 2 0.02203600 0.9583436 0.9389066 0.01727944 0.02495179
## 3 0.04407200 0.9040736 0.8599246 0.02085120 0.03018232
## 4 0.06610801 0.9040736 0.8599246 0.02085120 0.03018232
## 5 0.08814401 0.9040736 0.8599246 0.02085120 0.03018232
## 6 0.11018001 0.9040736 0.8599246 0.02085120 0.03018232
## 7 0.13221601 0.9040736 0.8599246 0.02085120 0.03018232
## 8 0.15425202 0.9040736 0.8599246 0.02085120 0.03018232
## 9 0.17628802 0.9040736 0.8599246 0.02085120 0.03018232
## 10 0.19832402 0.6195085 0.3234830 0.18299543 0.37466062
This printout shows us model performance for different values of the tuning parameter, cp. It seems for a high cp, we get a close to perfect model. Let’s take a look at this model. We could use the regular plot
function, but the resulting tree looks ugly. The prp
function from the rpart.plot
package makes a much nicer tree (other packages to plot nice trees exist).
ww=17.8/2.54; wh=ww; #for saving plot
dev.print(device=png,width=ww,height=wh,units="in",res=600,file="rparttree.png") #save tree to file
## png
## 2
So the model splits on month, repeatedly. And it also splits on the hemisphere, which makes sense since the seasons are switched in the Southern hemisphere. This is also likely the reason why the model with month only didn’t produce a perfect fit. It could get one hemisphere right, but not both. With both bits of information, we can get almost perfect predictions.
Note two distinguishing features of this tree model: Even though we fed the algorithm the full model including all predictor variables, some - in fact, almost all - of them are not part of the final model. This is a good illustration of the feature/variable selection property that a tree does automatically. If it doesn’t find a certain predictor variable useful, it leaves it out.
Also, note that some predictor variables are used more than once. In fact, in this example, only 2 variables are used, and they are used repeatedly.
You can also see on each node the predictions for each outcome category at that step. It is always possible to build a tree that predicts perfectly, but that would lead to overfitting. That’s why we use cross-validation and tuning of the cp
parameter, which reduces the risk of overfitting.
Finally, note that by default, levels are ordered alphabetically (Fall/Spring/Summer/Winter). We could re-order the factor manually in the more logical Spring/Summer/Fall/Winter order. I would do that for a ‘real’ analysis where I want to show a nice final result, but here we can leave it as is, as long as we pay attention to this fact.
So the above produces an almost perfect fit, and thus more powerful models are not really needed. However, using start (and end) month information seems a bit like cheating. Of course, if we give the model that kind of information, it will do well. Let’s make it harder and remove those 2 variables from both the training and test sets.
Also, further below, I had problems fitting some of the models, the NA caused problems. The issue often is that while the underlying algorithm can handle the missing values (as you saw above), when using wrappers like caret
, things break down. I could either skip caret
and try to access the different models directly. For now, I decided to go the other route and drop the data with the missing values. To be able to compare the different models below, I’m dropping those NA observations here. Since the data changed, we also need to re-do the null model computation to be able to compare properly.
#write code that removes StartMonth and EndMonth from both training and test sets
reducedata_train <- data_train %>%
select(-c(StartMonth, EndMonth))
reducedata_test <- data_test %>%
select(-c(StartMonth, EndMonth))
# then drop all observations with missing values in both trian and test sets
reducedata_train <- reducedata_train %>%
na.omit(data_train)
reducedata_test <- reducedata_test %>%
na.omit(data_test)
# copy and paste the code from above that computes performance of a null model
measureACC("", reducedata_train$season)
## [1] 0
redfrequencies <- as.matrix(summary(reducedata_train$season))
rednull_model <- max(redfrequencies)/length(reducedata_train$season)
rednull_model
## [1] 0.4513274
You should find a very similar null-model accuracy, around 0.46.
Now, let’s re-do the fit above fitting a single tree. I’ll increase the tuneLength value a bit so the algorithm can try a few more parameter values.
#copy and paste the code from above that fits the single tree. set tuneLength to 20.
set.seed(1111) #makes each code block reproducible
fitControl <- trainControl(method="repeatedcv",number=5,repeats=5)
fit1 = caret :: train(season ~ ., data=reducedata_train, method="rpart", trControl = fitControl, na.action = na.pass, tuneLength = 20)
print(fit1$results)
## cp Accuracy Kappa AccuracySD KappaSD
## 1 0.0000000000 0.4284408 0.1438959 0.05252553 0.07376618
## 2 0.0006508206 0.4284408 0.1438959 0.05252553 0.07376618
## 3 0.0013016412 0.4284408 0.1438959 0.05252553 0.07376618
## 4 0.0019524618 0.4284408 0.1438959 0.05252553 0.07376618
## 5 0.0026032824 0.4323348 0.1471768 0.05128394 0.07200520
## 6 0.0032541030 0.4319872 0.1456324 0.05311724 0.07431415
## 7 0.0039049236 0.4319872 0.1456324 0.05311724 0.07431415
## 8 0.0045557442 0.4394022 0.1498587 0.04365738 0.06877737
## 9 0.0052065648 0.4390451 0.1488255 0.04340505 0.06827654
## 10 0.0058573854 0.4411565 0.1505370 0.04278897 0.06746247
## 11 0.0065082060 0.4429014 0.1514678 0.03964114 0.06480351
## 12 0.0071590266 0.4432523 0.1502427 0.03972107 0.06480531
## 13 0.0078098472 0.4432523 0.1502427 0.03972107 0.06480531
## 14 0.0084606678 0.4453449 0.1445634 0.03861396 0.06301924
## 15 0.0091114884 0.4456989 0.1438107 0.03828775 0.06357066
## 16 0.0097623090 0.4446496 0.1270479 0.03661180 0.06924410
## 17 0.0104131296 0.4446526 0.1231019 0.03500559 0.06699294
## 18 0.0110639502 0.4474814 0.1226605 0.03856305 0.06847689
## 19 0.0117147708 0.4474814 0.1226605 0.03856305 0.06847689
## 20 0.0123655914 0.4488876 0.1154495 0.03148609 0.06037322
# look at model performance for different cp values. Also plot the tree.
prp(fit1$finalModel, extra = 1, type = 1)
ww=17.8/2.54; wh=ww; #for saving plot
dev.print(device=png,width=ww,height=wh,units="in",res=600,file="reducerparttree.png")
## png
## 2
With those variables removed, the tree model doesn’t perform very well. Accuracy is similar to the null model. You can see that in the tree figure, the final nodes (leaves) show a lot of mis-predictions. Note again that only a few variables are used to build the tree, and OBYear shows up more than once.
Let’s see if we can get improved performance with more complicated models. That is, of course, not guaranteed. If there is no “signal” in the data, it doesn’t matter how complicated the model is. We won’t get anything predictive.
Let’s try a random forest. We’ll use the ranger
algorithm for this (it’s generally faster than the rf
algorithm). This model has parameters that can and should be tuned. To do the tuning, we set up a grid of parameters and search over that grid. More efficient ways exist, e.g., doing an optimization using something like a genetic algorithm. The mlr
package allows you to do that, caret
doesn’t have those features out of the box, you would need to write your own code for that.
Note that running the code below (and several models that follow) might take a few seconds or minutes, depending on the speed of your computer.
set.seed(1111) #makes each code block reproducible
tuning_grid <- expand.grid( .mtry = seq(1,7,by=1), .splitrule = "gini", .min.node.size = seq(2,8,by=1) )
fit2 = caret :: train(season ~ ., data=reducedata_train, method="ranger", trControl = fitControl, tuneGrid = tuning_grid, na.action = na.pass)
We can’t plot a nice final tree anymore since the model is now a combination of trees. We can look at a plot of model performance as a function of the model tuning parameters.
This plot suggests that for around 4 randomly selected parameters and a minimum node size of 6, we get the best model. Note that there isn’t much difference in model performance for several different values of the tuning parameters, and the overall model isn’t that great either, an accuracy just shy of 0.5.
Let’s now try a boosted regression tree ensemble. This method also has several parameters that need tuning, which are specified in gbmGrid
.
## Loaded gbm 2.1.5
gbmGrid <- expand.grid(interaction.depth = seq(1, 7, by = 2), n.trees = 300, shrinkage = c(0.1, 0.01), n.minobsinnode = c(2,4,6))
fit3 = caret :: train(season ~ ., data=reducedata_train, method="gbm", trControl = fitControl, verbose=FALSE, tuneGrid = gbmGrid)
## Warning in (function (x, y, offset = NULL, misc = NULL, distribution =
## "bernoulli", : variable 4: CountryBrazil has no variation.
## Warning in (function (x, y, offset = NULL, misc = NULL, distribution =
## "bernoulli", : variable 5: CountryCa da has no variation.
## Warning in (function (x, y, offset = NULL, misc = NULL, distribution =
## "bernoulli", : variable 6: CountryChi has no variation.
## Warning in (function (x, y, offset = NULL, misc = NULL, distribution =
## "bernoulli", : variable 7: CountryCroatia has no variation.
## Warning in (function (x, y, offset = NULL, misc = NULL, distribution =
## "bernoulli", : variable 8: CountryDenmark has no variation.
## Warning in (function (x, y, offset = NULL, misc = NULL, distribution =
## "bernoulli", : variable 9: CountryFrance has no variation.
## Warning in (function (x, y, offset = NULL, misc = NULL, distribution =
## "bernoulli", : variable 10: CountryIraq has no variation.
## Warning in (function (x, y, offset = NULL, misc = NULL, distribution =
## "bernoulli", : variable 11: CountryIsrael has no variation.
## Warning in (function (x, y, offset = NULL, misc = NULL, distribution =
## "bernoulli", : variable 12: CountryItaly has no variation.
## Warning in (function (x, y, offset = NULL, misc = NULL, distribution =
## "bernoulli", : variable 15: CountryNetherlands has no variation.
## Warning in (function (x, y, offset = NULL, misc = NULL, distribution =
## "bernoulli", : variable 16: CountryNew Zealand has no variation.
## Warning in (function (x, y, offset = NULL, misc = NULL, distribution =
## "bernoulli", : variable 17: CountryNorway has no variation.
## Warning in (function (x, y, offset = NULL, misc = NULL, distribution =
## "bernoulli", : variable 18: CountryScotland has no variation.
## Warning in (function (x, y, offset = NULL, misc = NULL, distribution =
## "bernoulli", : variable 19: CountrySpain has no variation.
## Warning in (function (x, y, offset = NULL, misc = NULL, distribution =
## "bernoulli", : variable 20: CountryUK has no variation.
We can again look at diagnostic fits and variable importance plots for this model, as well as check performance.
It doesn’t look like the boosted tree model performs any better. It may be that no information in the predictors strongly correlates with the season.
But let’s not give up yet, we’ll try a bit more. Let’s see if pre-processing helps.
Here, we’ll fit another random forest model but now use centering and scaling for the predictors.
# copy the random forest code from above. Add a statement to the train() function that centers and scales predictors.
# save the result as fit4. plot model results.
set.seed(1111) #makes each code block reproducible
tuning_grid <- expand.grid( .mtry = seq(1,7,by=1), .splitrule = "gini", .min.node.size = seq(2,8,by=1) )
fit4 = caret::train(season ~ ., data=reducedata_train, method="ranger", trControl = fitControl,
preProc = c("center","scale"), tuneGrid = tuning_grid, na.action = na.pass)
## Warning in preProcess.default(thresh = 0.95, k = 5, freqCut = 19, uniqueCut
## = 10, : These variables have zero variances: CountryBrazil, CountryCa da,
## CountryChi , CountryCroatia, CountryDenmark, CountryFrance, CountryIraq,
## CountryIsrael, CountryItaly, CountryNetherlands, CountryNew Zealand,
## CountryNorway, CountryScotland, CountrySpain, CountryUK
It doesn’t look like it helped a lot.
Ok, let’s try one more. Since the trees don’t seem to work too well, and a logistic model doesn’t work for multiple categorical outcomes, let’s use another model that can do that, namely a discriminant analysis. We’ve already seen one of those previously. Let’s pick a different one. The caret package website lists a lot of algorithms. I don’t know how exactly they all differ. Let’s try the one called penalized discriminant analysis (pda) (penalized is another way of saying regularized, and we learned that regularization might sometimes help.)
#write code that trains a pda model, use tuneLength 20. Save as fit5 and plot.
set.seed(1111) #makes each code block reproducible
fitControl <- trainControl(method="repeatedcv",number=5,repeats=5)
fit5 <- caret::train(season ~ ., data=reducedata_train, method="pda", trControl = fitControl, na.action = na.pass, tuneLength = 20)
## Warning in nominalTrainWorkflow(x = x, y = y, wts = weights, info =
## trainInfo, : There were missing values in resampled performance measures.
## Warning in train.default(x, y, weights = w, ...): missing values found in
## aggregated results
Ok, that doesn’t look very good either. Alright, enough models, there just doesn’t seem to be much information in the data that could help predict season. So let’s start to wrap up.
To recap: After we removed the obvious predictors, we fitted 1 tree, 1 random forest, 1 gradient boosted tree, 1 random forest with processed predictors, and 1 discriminant analysis. Let’s compare the performance.
resamps <- resamples(list(tree = fit1,
RF1 = fit2,
GBM = fit3,
RF2 = fit4,
PDA = fit5))
bwplot(resamps)
This plot suggests that while none of the models are great, the random forest ones seem overall slightly better.
Even though we didn’t really have any good model, and thus further evaluating it seems, in some sense pointless, for this exercise we’ll look at our “best” model anyway. We’ll declare the 1st random forest model (saved as fit2
) to be the best.
Model uncertainty in the predictions is shown in the previous plot.
For categorical outcomes, we can’t plot residuals. But we can look at the final “2x2” (in this case, a 4x4) table (the confusion matrix) and compare true versus predicted outcomes and see if it shows any pattern.
#Write code to get model predictions for the outcome on the training data.
Tprediction <- predict(fit2, reducedata_train)
confusionMatrix(Tprediction, reducedata_train$season)$table
## Reference
## Prediction Fall Spring Summer Winter
## Fall 74 0 4 1
## Spring 0 79 0 1
## Summer 0 1 57 0
## Winter 24 57 14 253
#use predicted and actual outcomes, make a table and compute accuracy.
mlr::measureACC(reducedata_train$season, Tprediction)
## [1] 0.819469
You should see that the model gets a lot right (high numbers on the diagonal), but predicts winter more often than it should (last row). Accuracy in the training data is pretty good.
But we know that performance on the training set is not that meaningful, especially with a complex model we always get fairly good performance on the data used to build the model. What matters is how it performs on new data, so let’s check that. We can look at the same for the test set, which is a better estimate of the true performance.
#copy and paste the code from above, but now do it for the test set.
Testprediction <- predict(fit2, reducedata_test)
confusionMatrix(Testprediction, reducedata_test$season)$table
## Reference
## Prediction Fall Spring Summer Winter
## Fall 9 7 7 6
## Spring 1 6 3 3
## Summer 1 4 3 3
## Winter 26 33 14 103
#use predicted and actual outcomes, make a table and compute accuracy.
mlr::measureACC(reducedata_test$season, Testprediction)
## [1] 0.5283843
Here, the confusion matrix doesn’t look good at all. Off-diagonal entries are larger than diagonal, accuracy is about as good as a null model, and agrees with the cross-validated results. That last point is good, that means our cross-validation routine properly estimates the performance of “new” data. Of course, even this estimate on test data is a bit optimistic, since real new data is usually collected under slightly different circumstances and with different protocols, making it more likely that model performance is reduced.
# shut down the parallel computing cluster we created at the beginning of the analysis
stopCluster(cl)
Overall, this suggests there is just no “signal” in the variables we are trying to use to predict the outcome, and the model fits to “noise” - thus doing ok on training data but failing on the test/cross-validated performance evaluation.
We can conclude that this is an analysis where we walk away “empty handed”. If this were a real analysis and you had data and did a ‘let’s see if something is going on’ analysis, this would be somewhat disappointing. If you had a specific, plausible hypothesis before you started your analysis (e.g., that outbreak size is correlated with season), finding that your biologically reasonable hypothesis doesn’t seem to be right is useful. Unfortunately, null results are still hard to publish.
Note that we didn’t use p-values here, but I bet we would have found several that are statistically significant when evaluated on the training data (as they usually are). But they would be meaningless and essentially “fitting the noise”. I contend that a lot of what’s published out there is exactly that, spurious p-values because models are evaluated on the training data.
Above, I kept search grids relatively small and specified other things (e.g., number of trees) to make sure things run reasonably fast. For a real project, I would make my searches and tuning more exhaustive, which might mean waiting a few hours for the code to run. If you want to, try to increase the search space or try different models to see if you can get a better performing model. It doesn’t seem to me that the data has any meaningful signal that would lead to a great model with much-improved performance. But you are welcome to see if you can find a model that performs better. If you do get a model that performs well (>0.6 accuracy), let me know. I’d be curious to see it.


Alan T. Arnholt, Ph.D. Professor of Statistics<EMAIL_ADDRESS>Office Hours Click for Availability
Mailing Address
Appalachian State University
Department of Mathematical Sciences
Walker Hall 237
121 Bodenheimer Dr
Boone, NC 28608


Widget module.
MIT. See LICENSE for full details.
A paned window widget displays a number of subwindows, stacked either vertically or horizontally. The user may adjust the relative sizes of the subwindows by dragging the sash between panes.
// The paned window must be created first. // See the constructor notes in the documentation. auto panedWindow = new PanedWindow(); // The pane's widgets are contained within the frames. auto left = new Frame(panedWindow); auto right = new Frame(panedWindow); panedwindow.addPane(left) .addPane(right) .pack();
<<EnteredChild>>, <<PrevWindow>>, <Alt-Key>, <B1-Motion>, <Button-1>, <ButtonRelease-1>, <Enter>, <Key-F10>, <Key-Tab>, <Leave>, <Motion>,
Construct the widget.
| UiElement parent | The parent of this widget. |
| string orientation | The orientation of the widget. |
Because this widget contains and handles other widget's geometry, it must be created before the child panes and not chained with methods that add new tabs. If it is chained, tabs will not be handled correctly and might not show at all. This seems to be a limitation with Tcl/Tk.
tkd.element.UiElement
tkd.widget.orientation for orientations.
Construct the widget.
| string orientation | The orientation of the widget. |
Because this widget contains and handles other widget's geometry, it must be created before the child panes and not chained with methods that add new tabs. If it is chained, tabs will not be handled correctly and might not show at all. This seems to be a limitation with Tcl/Tk.
tkd.widget.orientation for orientations.
Add a pane to the paned window. When adding a pane to the paned window the pane gains an id that is equal to the passed widget's id and can be used later to refer to the new pane.
| Widget widget | The widget to add as the pane. |
This widget to aid method chaining.
Insert a pane into the paned window at a specified zero based index or before another pane id. When adding a pane to the paned window for the first time the pane gains an id that is equal to the passed widget's id and can be used later to refer to the new pane. If the id of the widget passed is already used as a pane id then that existing one will be moved to the new position.
| I paneIdentifier | The zero based index or string id of the pane. |
| Widget widget | The widget to add as the pane. |
This widget to aid method chaining.
Remove a pane from the paned window.
| I paneIdentifier | The zero based index or string id of the pane. |
This widget to aid method chaining.
Set the pane weight. Weight is an integer specifying the relative stretchability of the pane. When the paned window is resized, the extra space is added or subtracted to each pane proportionally to its weight.
| I paneIdentifier | The zero based index or string id of the pane. |
| int weight | The new weight of the pane. |
This widget to aid method chaining.
Get an array of all the current pane id's.
An array containing all the pane id's.
Sets the position of a sash. May adjust the positions of adjacent sashes to ensure that positions are monotonically increasing. Sash positions are further constrained to be between 0 and the total size of the widget. Must be called after the UI has been drawn.
| int sashIndex | The index of the sash. |
| int position | The new position of the sash. |
Get the position of a sash. Must be called after the UI has been drawn.
| int sashIndex | The index of the sash. |
Set the height of the widget if the geometry manager allows.
| int height | The desired widget height. |
This widget to aid method chaining.


{% extends 'causknow/base.html' %} {% block content %}
1. causKnow is a semantic web-based application deployed on a cloud architecture.
2. Basically, causKnow lays its foundation over ontological engineering principles. It makes use of a multi-layered ontological formalism for context-aware dissemination of causal knowledge about a given phenomenon. Read this scientific publication to find more. (https://www.sciencedirect.com/science/article/pii/S1474034618301642)
3. At its core, causKnow appreciates certain epistemological concerns around knowledge sharing and reuse; by adding a context-sensing power to its knowledge retrieval mechanism. End user can define contextual attributes of interest and query a graph-based database containing FCM-driven causal knowledge representations.
4. The current meta-model of causKnow’s knowledge representation and reasoning scheme supports the Fuzzy Cognitive Mapping approach. FCM, combining the principles of neuro-computing and Fuzzy logic, is an intuitive tool which exploits expert causal judgements for anticipation of future states of highly dynamic, distributed, and complex systems.
5. At the moment, causKnow allows for uploading FCM scenarios as ontological instances in various serializations such as RDF/XML, Turtle, N3, etc.
6. We believe in open knowledge-sharing in action! Find causKnow’s Github repo here: Falconio


ROCKY V A film review by Nathan Shafer Copyright 1990 Nathan Shafer
Capsule Review: Rocky, due to his brother-in-law's financial mismanagement, his wealth, and returns to his old neighborhood. He is also forced by medical problems resulting from boxing to retire from fighting, while promoters clamor for more fights. This is a nice change from the monolithic juggernaut of the last three films, and a return to the kind of characterization that made the first film great. A bit heavy-handed at times, it still pleases and (wonder of wonders!) surprises from time to time.
On the Leeper Scale, I give it a high +1 to low +2 ( -4 to +4).
Many of the best stories I have read or seen on film have been variations on the "test tube" model of plotting: take some chemicals (or characters), throw them together in a test tube, and see what happens. The more reactive and volatile the chemicals (or the characters), the better. Stories which follow this model usually follow one of two paths: a "slice of life" path, which shows realisticly what would happen to such characters in such a situation at a realistic pace, or a hyperbolic path, in which events which would realistically occur over a span of years take only a few weeks, or even a few hours, and in which characters' motivations are amplified to a level approaching parody. This film follows the second of these two paths.
The problems facing the Balboa Clan as they move back into the original seedy neighborhood they originally left behind are predictable: Less physical comforts; neighbor-fans constantly hanging around; Rocky's kid, who now has to attend the local public school, facing harassment by the neighborhood "bad boys." These are all present, and they are not done especially realistically. The kids in this "seedy" neighborhood of Philly, for example, are all white, and the worst vices they seem to have acquired are cigarette smoking and having pierced ears. The image of Philly's bad neighborhood seems to be a gentle one, pre-desegregation and pre-crack.
There is an extra complication, however: Tommy Gunn, a young boxer from Oklahoma (he looks oh-so-farmboy, too!), who idolizes Rocky and has come to Philly to seek him out, and receive the wisdom of this boxing guru. Rocky, seeing a chance at vicarious re-attainment of greatness, takes Tommy under his wing to train him, while neglecting his son, who desperately needs the kind of fatherly support Rocky bestows to Tommy. Themes of fatherhood, parental neglect, and juvenile rebellion are raised here, but the situations that come up in a matter of weeks seem to be the kind that in real life occur over years. This, however, does not detract from the power of this side of the movie. The questions raised here are dealt with neither delicately nor subtlely, but neither are they dismissed with platitudinous responses or excessive exposition.
On the technical side, this movie uses to full effect the kind of imagery the Rocky films have been built on: sweeping montages, images of faces in the crowd, Adrienne saying Rocky's name, and of course punches, punches, punches, seen from every angle and with blood on the mat to spare. The film, however, also takes advantage of Rocky's brain damage to use some surreal imagery of Rocky's previous fight with Ivan Drago, as well as some reminiscences of Mickey, Rocky's old trainer (played once again by the wonderful Burgess Meredith). This is in fact the most nostalgic of the Rocky movies, looking back on them with fond memories. As Rocky prepares to move into the old neighborhood, he doffs his old hat from the old days when he was muscle for a loan shark; Adrienne returns to work at the pet store where she originally met Rocky; Rocky returns to work at the gym where it all started.
In many ways, this movie is like going home, after a rather tasteless digression into world politics and several boring rehashes of the old question of the "immovable object" and the "unstoppable force." It is especially pleasing to note that even within ten minutes of the end I wasn't sure how the film would end; this film, unlike the others, does not have the sunny Reagan Era Stallone who uttered such lines as "Go for it." Stallone seems to have, upon entering the 90s, reflected some upon his own mortality, the transience of wealth, and some of the simpler pleasures of life.
Nathan Shafer Dartmouth College, NH
.
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


1. Sign in NEW Windows Live Spaces.
2. Click Your Space button.
3. Click Options -> E-mail publishing item.
4. Enable e-mail publishing by checking Turn on e-mail publishing.
5. Enter one of your e-mail addresses
6. Enter a SECRET WORD - IT IS!
7. Select Publish entries immediately
8. Click Save button.
© 2007 BELEM


2 Chronicles 17:15
And next to him was Jehohanan the captain, and with him two hundred and fourscore thousand.


QMacCocoaViewContainer Class
The QMacCocoaViewContainer class provides a widget for macOS that can be used to wrap arbitrary Cocoa views (i.e., NSView subclasses) and insert them into Qt hierarchies. More...
| Header: | #include <QMacCocoaViewContainer> |
| qmake: | QT += widgets |
| Since: | Qt 4.5 |
| Inherits: | QWidget |
Public Functions
| QMacCocoaViewContainer(NSView *cocoaViewToWrap, QWidget *parent = Q_NULLPTR) | |
| virtual | ~QMacCocoaViewContainer() |
| NSView * | cocoaView() const |
| void | setCocoaView(NSView *view) |
- 214 public functions inherited from QWidget
- 32 public functions inherited from QObject
- 14 public functions inherited from QPaintDevice
Additional Inherited Members
- 59 properties inherited from QWidget
- 1 property inherited from QObject
- 19 public slots inherited from QWidget
- 1 public slot inherited from QObject
- 3 signals inherited from QWidget
- 2 signals inherited from QObject
- 1 public variable inherited from QObject
- 5 static public members inherited from QWidget
- 10 static public members inherited from QObject
- 35 protected functions inherited from QWidget
- 9 protected functions inherited from QObject
- 1 protected function inherited from QPaintDevice
- 1 protected slot inherited from QWidget
- 2 protected variables inherited from QObject
- 1 protected type inherited from QPaintDevice
Detailed Description
The QMacCocoaViewContainer class provides a widget for macOS that can be used to wrap arbitrary Cocoa views (i.e., NSView subclasses) and insert them into Qt hierarchies.
While Qt offers a lot of classes for writing your application, Apple's Cocoa frameworks offer functionality that is not currently available (or may never end up) in Qt. Using QMacCocoaViewContainer, it is possible to take an arbitrary NSView-derived class from Cocoa and put it in a Qt widgets hierarchy. Depending on the level of integration you need, you can use QMacCocoaViewContainer directly or subclass it to wrap more functionality of the underlying NSView.
It should be also noted that, at the Cocoa level, there is a difference between top-level windows and views (widgets that are inside a window). For this reason, make sure that the NSView that you are wrapping doesn't end up as a top-level window. The best way to ensure this is to make sure QMacCocoaViewContainer's parent widget is not null.
If you are using QMacCocoaViewContainer as a subclass and are accessing Cocoa API, it is probably simpler to have your file end with .mm
instead of .cpp
. Most Apple tools will correctly identify the source as Objective-C++.
QMacCocoaViewContainer requires knowledge of how Cocoa works, especially in regard to its reference counting (retain/release) nature. It is noted in the functions below if there is any change in the reference count. Cocoa views often generate temporary objects that are released by an autorelease pool. If this is done outside of a running event loop, it is up to the developer to provide the autorelease pool.
The following is a snippet showing how to subclass QMacCocoaViewContainer to wrap an NSSearchField.
SearchWidget::SearchWidget(QWidget *parent) : QMacCocoaViewContainer(0, parent) { // Many Cocoa objects create temporary autorelease objects, // so create a pool to catch them. NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; // Create the NSSearchField, set it on the QCocoaViewContainer. NSSearchField *search = [[NSSearchField alloc] init]; setCocoaView(search); // Use a Qt menu for the search field menu. QMenu *qtMenu = createMenu(this); NSMenu *nsMenu = qtMenu->macMenu(0); [[search cell] setSearchMenuTemplate:nsMenu]; // Release our reference, since our super class takes ownership and we // don't need it anymore. [search release]; // Clean up our pool as we no longer need it. [pool release]; }
Member Function Documentation
QMacCocoaViewContainer::QMacCocoaViewContainer(NSView *cocoaViewToWrap, QWidget *parent = Q_NULLPTR)
Create a new QMacCocoaViewContainer using the NSView pointer in cocoaViewToWrap with parent, parent. QMacCocoaViewContainer will retain cocoaViewToWrap.
[virtual]
QMacCocoaViewContainer::~QMacCocoaViewContainer()
Destroy the QMacCocoaViewContainer and release the wrapped view.
NSView *QMacCocoaViewContainer::cocoaView() const
Returns the NSView that has been set on this container.
See also setCocoaView().
void QMacCocoaViewContainer::setCocoaView(NSView *view)
Sets view as the NSView to contain and retains it. If this container already had a view set, it will release the previously set view.
See also cocoaView().


Guide & Tips
Horse racing is one of the world’s oldest sports, dating to about 6,500 years ago in the Middle East and ancient Greece with forms of it also taking place during the ancient Olympic Games. It’s likely that people started betting on those races from the early going. Horse racing and betting on the sport then spread around the world. In fact, it has been one of the most betting-friendly events in the United States for some time.
Are you new to horse racing? Take a look at our strategy guide & tips so that you can be ready to make the most of your experience.
Types of Bets
The most important thing to know is what the different types of bets mean. Here are the most common ones.
Win.
This one is straightforward. If the horse you bet on to “win” does, you also win. Your bet, that is.
Place.
This is the bet to take if you believe that your horse will finish in the top two places. If it does – it doesn’t matter which one – you also win some money.Show.
Same idea but extended one more placement. If your chosen horse finishes anywhere in the top three of the official results, you win your bet.
Meanwhile, if you want to take advantage of betting options that would provide you with a more significant payday should you be successful, consider these bets.
Exacta.
You pick two horses and specify which one will finish first and which will be second.
Trifecta.
The exacta extended by a position and, as a result, receiving significantly higher odds. You predict which horse will finish first, which will come in second and which will cross the line third.
Superfecta.
You predict the first four finishers, in order.
Pick 3.
You have to accurately predict the winner in three straight races. You must place your bet before the first race starts.
Pick 4.
If you correctly choose the winner in four straight races, you receive a significant payday.
Another type of bet that many utilize is the quinella. You pick one horse; if it finishes first or second, you win.
How to Bet
When you are speaking to the teller, provide the following information.
- racetrack, if you’re not on site
- race number
- bet amount
- type of bet
- number of the horse
Tips
Even if you are a beginner, you’re going to want to utilize a strategy guide & tips in order to increase your odds of winning.

Perhaps the most important thing that you can do is read the race day program, if available, and research what the participating horses have done in previous races.
The Daily Racing Form is a famous resource for the latter.
Even basic information can really help you get a step up on the competition and place a more knowledgeable bet.
While looking at previous results, see if a horse that you are considering has recently moved up or down classes.
These categories are maiden, claiming, allowance and stakes.
Maiden races involve horses who have not won one yet while stakes races involve the best horses.
The latter category includes races such as the Triple Crown: the Kentucky Derby, Preakness Stakes and Belmont Stakes.
The most important thing to look for when seeing horses changing classes is that if one has repeatedly come in first or second in recent races but those were in a lower class, those high placements are going to be much less likely with the higher level of competition that they would be facing now.
Conversely, a horse that dropped classes will most likely finish in a higher placement at those lower-level races.
You will also want to look at how well or how poorly a horse that you are considering has done on certain tracks and in what weather conditions.
You might discover a trend where a horse tends to finish quite high on dirt tracks but does not when the surface is artificial or some other useful information.
You can also look at who the jockey is.
If he or she tends to finish quite high or low regardless of what horse is being ridden, that is something to also consider when deciding which horse to bet on.
Lastly, if this option is available to you, consider looking at the horse’s body language in the paddock and before the race.
Just like with human athletes, you can often tell how well they will perform based on what body language signs they are giving off immediately prior to the competition.
Of course, make sure that you still give yourself enough time to place the bet before the race starts.


Frequently Asked Questions¶
Apache Process Crashes¶
Q: Why when the mod_wsgi module is initially being loaded by Apache, do the Apache server processes crash with a ‘segmentation fault’?
A: This is nearly always caused due to mod_python also being loaded by Apache at the same time as mod_wsgi and the Python installation not providing a shared library, or mod_python having originally being built against a static Python library. This is especially a problem with older Linux distributions before they started shipping with Python as a shared library.
Further information on these problems can be found in various sections of [InstallationIssues Installation Issues].
Q: Why when first request is made against a WSGI application does the Apache server process handling the request crash with a ‘segmentation fault’?
A: This is nearly always caused due to a shared library version conflict. That is, Apache or some Apache module is linked against a different version of a library than that which is being used by a particular Python module that the WSGI application makes use of. The most common culprits are the expat and MySQL libraries, but it can also occur with other shared libraries.
Another cause of a process crash only upon the first request can be a third party C extension module for Python which has not been implemented so as to work within a secondary Python sub interpreter. The Python bindings for Subversion are a particular example, with the Python module only working correctly if the WSGI application is forced to run within the first interpreter instance created by Python.
Further information on these problems can be found in various sections of Application Issues. The problems with the expat library are also gone into in more detail in Issues With Expat Library.
Q: Why am I seeing the error message ‘premature end of script headers’ in the Apache error logs.
A: If using daemon mode, this is a symptom of the mod_wsgi daemon process crashing when handling a request. You would probably also see the message ‘segmentation fault’. See answer for question about ‘segmentation fault’ above.
This error message can also occur where you haven’t configured Apache correctly and your WSGI script file is being executed as a CGI script instead.
HTTP Error Responses¶
Q: When I try to use mod_wsgi daemon mode I get the error response ‘503 Service Temporarily Unavailable’.
A: The standard Apache runtime directory has restricted access and the Apache child process cannot access the daemon process sockets. You will need to use the WSGISocketPrefix directive to specify an alternative location for storing of runtime files such as sockets.
For further information see section ‘Location Of UNIX Sockets’ of [ConfigurationIssues Configuration Issues].
Q: I am getting a HTTP 500 error response and I can’t find any error in the Apache error logs.
A: Some users of mod_wsgi 1.3/2.0 and older minor revisions, are finding that mod_wsgi error messages are going missing, or ending up in the main Apache error log file rather than a virtual host specific error log file. Specifically, this is occurring when Apache ErrorLog directive is being used inside of a VirtualHost container.
It is not known exactly what operating system setup and/or Apache configuration is the trigger for this problem. To avoid the problem, use a newer version of mod_wsgi.
HTTP Error Log Messages¶
Q: Why do I get the error ‘IOError: client connection closed’ appearing in the error logs?
A: This occurs when the HTTP client making the request closes the connection before the complete response for a request has been written.
This can occur where a user force reloads a web page before it had been completely displayed. It can also occur when using benchmarking tools such as ‘ab’ as they will over commit on the number of requests they make when doing concurrent requests, killing off any extra requests once the required number has been reached.
In general this error message can be ignored.
Application Reloading¶
Q: Do I have to restart Apache every time I make a change to the Python code for my WSGI application?
A: If your WSGI application is contained totally within the WSGI script file and it is that file that you are changing, then no you don’t. In this case the WSGI script file will be automatically reloaded when a change is made provided that script reloading hasn’t been disabled.
If the code you are changing lies outside of the WSGI script file then what you may need to do will depend on how mod_wsgi is being used.
If embedded mode of mod_wsgi is being used, the only option is to restart Apache. You could set Apache configuration directive MaxRequestsPerChild to 1 to force a reload of the application on every request, but this is not recommended because it will perform as bad as or as worse as CGI and will also affect serving up of static files and other applications being hosted by the same Apache instance.
If using daemon mode with a single process you can send a SIGINT signal to the daemon process using the ‘kill’ command, or have the application send the signal to itself when a specific URL is triggered.
If using daemon mode, with any number of processes, and the process reload mechanism of mod_wsgi 2.0 has been enabled, then all you need to do is touch the WSGI script file, thereby updating its modification time, and the daemon processes will automatically shutdown and restart the next time they receive a request.
Use of daemon mode and the process reload mechanism is the preferred mechanism for handling automatic reloading of code after changes.
More details on how source code reloading works with mod_wsgi can be found in Reloading Source Code.
Q: Why do requests against my application seem to take forever, but then after a bit they all run much quicker?
A: This is because mod_wsgi by default performs lazy loading of any application. That is, an application is only loaded the first time that a request arrives which targets that WSGI application. This means that those initial requests will incur the overhead of loading all the application code and performing any startup initialisation.
This startup overhead can appear to be quite significant, especially if using Apache prefork MPM and embedded mode. This is because the startup cost is incurred for each process and with prefork MPM there are typically a lot more processes that if using worker MPM or mod_wsgi daemon mode. Thus, as many requests as there are processes will run slowly and everything will only run full speed once code has all been loaded.
Note that if recycling of Apache child processes or mod_wsgi daemon processes after a set number of requests is enabled, or for embedded mode Apache decides itself to reap any of the child processes, then you can periodically see these delayed requests occurring.
Some number of the benchmarks for mod_wsgi which have been posted do not take into mind these start up costs and wrongly try to compare the results to other systems such as fastcgi or proxy based systems where the application code would be preloaded by default. As a result mod_wsgi is painted in a worse light than is reality. If mod_wsgi is configured correctly the results would be better than is shown by those benchmarks.
For some cases, such as when WSGIScriptAlias is being used, it is actually possible to preload the application code when the processes first starts, rather than when the first request arrives. To preload an application see the WSGIImportScript directive.
By preloading the application code you would not normally see delays in requests being handled. The only exception to this would be when running a single process under mod_wsgi daemon mode and the process is being restarted when a maximum number of requests arrives or explicitly via one of the means to trigger reloading of application code. Delays here can be avoided by running at least two processes in the daemon process group. This is because when one process is restarting, the others can handle the requests.
Execution Environment¶
Q: Why do I get the error ‘IOError: sys.stdout access restricted by mod_wsgi’?
A: A portable WSGI application or application component should not output anything to standard output. This is because some WSGI hosting mechanisms use standard output to communicate with the web server. If a WSGI application outputs anything to standard output it will thus potentially interleave with the response sent back to the client.
To promote portability of WSGI applications, mod_wsgi by default restricts direct use of ‘sys.stdout’ and ‘sys.stdin’. Because the ‘print’ statement defaults to outputing text to ‘sys.stdout’, using ‘print’ for debugging purposes can cause this error.
For more details about this issue, including how applications should do logging and how to disable this restriction see section ‘Writing To Standard Output’ in Application Issues and section ‘Apache Error Log Files’ in Debugging Techniques.
Q: Can mod_wsgi be used with Python virtual environments created using Ian Bicking’s ‘virtualenv’ package?
A: Yes. For more details see Virtual Environments.
Access Control Mechanisms¶
Q: Why are client user credentials not being passed through to the WSGI application in the ‘HTTP_AUTHORIZATION’ variable of the WSGI environment?
A: User credentials are not passed by default as doing so is insecure and could expose a users password to WSGI applications which shouldn’t be permitted to see it. Such a situation might occur within a corporate setting where HTTP authentication mechanisms were used to control access to a corporate web server but it was possible for users to provide their own web pages. The last thing a system administator will want is normal users being able to see other users passwords.
As a result, the passing of HTTP authentication credentials must be explicitly enabled by the web server administrator. This can only be done using directives placed in the main Apache confguration file.
For further information see Access Control Mechanisms and the documentation for the WSGIPassAuthorization directive.
Q: Is there a way of having a WSGI application provide user authentication for resources outside of the application such as static files, CGI scripts or even a distinct application. In other words, something akin to being able to define access, authentication and authorisation handlers in mod_python?
A: Providing you are using Apache 2.0 or later, version 2.0 of mod_wsgi provides support for hooking into the Apache access, authentication and authorisation handler phases. This doesn’t allow full control of how the Apache handler is implemented, but does allow control over how user credentials are validated, determination of what groups a user is a member of and whether specific hosts are allowed access. This is generally more than sufficient and makes the task somewhat simpler than needing to implement a full handler like in mod_python as Apache and mod_wsgi do all the hard work.
For further information see Access Control Mechanisms.


Multiple assignment
def find_best(key):
...
return new_key, value
key, value = find_best(key)
a, b = b, a # swap
Interval test
if 2 < x < 4:
print "x is between 2 and 4."
Set membership test
if val in ('foo','bar'): # or {'foo','bar'}: a set
For performance, store the tuple/set in a variable (whose name could be useful documentation), or just do
if val=='foo' or val=='bar':
Conditional expression
What in CeeLanguage is written:
c ? x : y
is in Python (see http://www.python.org/peps/pep-0308.html for history):
x if c else y # note order
In Python <2.5, use (if you must) one of:
c and x or y # incorrectly returns y if x is (any kind of) false
(c and [x] or [y])[0] # reliable, but ugly and churns objects
(x, y)[not c] # always evaluates both
(y, x)[c] # only if c is really a bool (or otherwise 0 or 1)
for f in foo:
print f * bar
not
for i in range(len(foo)):
print foo[i] * bar
Iterating over the lines in a file
with open('foo') as f: # automatically close f even on exception
for line in f:
...
not
f=file('foo') # synonym for open; see http://mail.python.org/pipermail/python-dev/2004-July/045921.html
for line in f.readlines(): # store whole file in memory
...
In CPython, the "with" is not so necessary, as dropping the last reference to f will close the file (but that can happen later than you think in case of exceptions).
Repeat-until loop
while True:
...
if test: break
...
Rather than getters and setters, simply write
class MyObj(object):
def __init__(self): self.foo=0
obj=MyObj()
obj.foo=4
You can later make foo a property if logic is necessary:
class MyObj(object):
def __init__(self): self._foo=1 # oops, it has to be odd now
@property # this is a "decorator"
def foo(self): return self._foo
@foo.setter
def foo(self,x): self._foo=x-x%2+1 # round up to next odd number
obj=MyObj()
obj.foo=4 # now assigns 5
disp = { 0: f0, 1: f1, 2: f2, 3: f3 } # dictionary of functions
x=disp[n](...) # choose and call
not
if n==0: x=f0(...)
elif n==1: x=f1(...)
elif n==2: x=f2(...)
elif n==3: x=f3(...)
else: raise KeyError(n) # for symmetry with the above
(Python has no SwitchStatement.)
If a function stores a mutable argument, you might want to copy it to avoid action at a distance:
class A(object):
def f(self,l): self.list=l[:]
If it's common for the call to look like:
a=A()
a.f([1,2,3]) # no other reference to this list anyway
(but with a large list that shouldn't be needlessly copied) you can (in CPython) optimize away the copy:
import sys
class A(object):
def f(self,l):
if sys.getrefcount(l)>3: l=l[:]
self.list=l
The three allowed references are l itself, and its presence in the argument lists of f() and of getrefcount().
(This occurred to me just before writing this on June 20 2013; thoughts welcome. -- DavisHerring)
The PythonCookbook: ISBN<PHONE_NUMBER> and http://aspn.activestate.com/ASPN/Cookbook/Python/, parts of which are written/edited by the illustrious Alex Martelli.
From Monty Python and the Holy Grail:
LAUNCELOT: No, no, sweet Concorde! Stay here! I will send help as soon as I have accomplished a daring and heroic rescue in my own particular... [sigh]
CONCORDE: Idiom, sir?
LAUNCELOT: Idiom!
See also http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html


| Event Name: |
|
| Event Date: |
Format: |
| Number of Teams Per Pool: |
|
| Total Number of Pools: |
(0 = total teams / teams per pool) |
| Include Power Pools: |
|
| Number of Power Pools: |
|
| Teams per Power Pool: |
|
| Avoid Same Club in Same Pool: |
|
Dates, Times, & Locations: |
|
| Paste Team List Here => |
|
|
|


Sun offers an alternative to Windows with the Solaris Enterprise System, a unified platform
of Solaris 10, Java Enterprise System, developer tools and N1
management software. Pay only for the support you need.
Advanced Solaris OS Features
A $500-million investment produced the most advanced operating system ever built, with more than 600 new features
in Solaris 10, such as DTrace, Predictive Self-Healing, Solaris Containers, and ZFS.
Agile Business Integration
Easily develop, deploy, and manage enterprise integration projects with the secure, scalable SOA-based Java Composite Application Platform Suite.
Identity Management
The industry's most complete and integrated suite of tools to securely manage user identities across a variety of
computing infrastructures and environments.
Integrated Open Source Applications
188 of the leading open source packages are included, pre-compiled and ready to go. Use them out of the box or
interchange them with parts of the Sun infrastructure software stack to best meet your needs.
Run Enterprise Databases
From Oracle to MySQL, including the open source PostgreSQL for Solaris, the Solaris Enterprise System is the database platform of choice for enterprise customers.
Ensure Regulatory Compliance
With the Solaris OS and the Sun Java System Identity Manager, the Solaris Enterprise System helps customers
with regulatory compliance and top security challenges.
Serve the Web Out of the Box
Solaris 10 is optimized for running Web services and includes Apache and Tomcat software to let you deploy services right away.
(1) SPEC OMPM2001 results: Sun Fire V40z server, 12,434 (four cores, four chips, four threads).
Sun Fire V40z server, 11,223 (four cores, four chips, four threads). IBM eServer OpenPower 710 server, 10,750
(four cores, two chips, eight threads). IBM eServer pSeries 655 server, 8356 (four cores, four chips, four threads).
Hewlett-Packard AlphaServer GS1280 7/1300, 8225 (four cores, four chips, four threads). HP rx7620 server, 6886
(four cores, four chips, four threads). SPEC & SPEComp are registered trademarks of the Standard Performance
Evaluation Corporation. Results on www.spec.org as of April 7, 2005.
“We favor Solaris because we've seen it's faster than Linux for the same applications with no changes, especially large memory footprint applications.”
— Neal Tisdale Vice President of Software Development NewEnergy Associates, a Siemens Company


Shopping cart
Tips: The order is subject to the final order
No data
Product name
Unit price
Quantity
Total
Operating
Product name
1299yuan
1299yuan
×
Continue shopping
|
共
13
Items
Total (excluding freight):
1299.00yuan


H3 boasts of one of the richest cultural talent in the institute. And not to mention , last year's PAF !! We didn't only win PAF , we thrashed all opponents grabbing a clean sweep win. Yes, a clean sweep - we won in all 9 departments . \m/ H3 Cracked 3rd position in overally CULT GC TALLY after H2 and H9. Get ready , PAF is coming ... again!! \m/
High on spirits, Hostel 3 is best known for its enthusiastic inmates. Be it excelling in sports, outranking others in cultural or shining bright at institute festivals, our hostel has been there done that!! And this plethora of accomplishments doesnt make it stop. Hostel 3 is out for a kill--and even sky is not the limit!!
Hostel 3 has always been home to the institute's best when it comes to technical activities. This is a hostel where there is something going on throughout the year, be it the racing cars being built for TrackMania, the line followers, the fundae sessions conducted by seniors, setting up the Robocon arena and building its bot, etc. For a hostel bubbling with enthusiasm, tech just never seems to come to a halt.
If you are an old member of the H3 family, then do take the time to register yourself. If you are feeling nostalgic, or just plain want to see how the hostel looks today, look at some photographs. Feel free to wander around the site, and send us your valuable suggestions-And stay in touch with us!


SnapOperationQueue
Currently work in progress, not yet fit for consumption
SnapOperationQueue is made to resemble NSOperationQueue and has options to quickly rearrange the queued priorities
In Snapsale we make A LOT of network requests to our backend. At the same time, it is easy to navigate from screen to screen. When we go from one screen to another, we do not want the currently visible screen to have its data arrive late because we were executing network requests for a screen that is no longer visible. The information on the screen that is no longer visible is still relevant: the user will probably go back. But it should be deprioritized to what the currently visible screen needs. Similarly, when scrolling a scroll view, what is visible on screen should take priority of what has been scrolled off screen.
Of course, there are situations where an operation that has not yet been performed yet is no longer needed, and should be cancled. Also, there are situations where an operation should have the highest priority no matter what is visible on screen.
SnapOperationQueue wraps four queues with the following priorities: .Highest .High .Normal .Low
.Highest and .Low don’t rearrange. When operations with dependent operations rearrange, they are put in the queue that matches the highest priority in its set of dependencies.
An operation is added with an identifier, a priority (defaults to .High) and a group identifier. The group identifier would typically be your view controller identifier. Then, on viewDidDisappear, it would call queue.setGroupPriorityTo(.Low, forId: groupId). Remember to wrap groupIds in a StringRepresentable enum. When the view controller reappears, it would call queue.setGroupPriorityTo(.High, forId: groupId)
Uses PSOperations, a maintained version of Apple’s WWDC'15 sample code. It is good, and you should use it instead of NSOperation


FAQ
Q: What mitochondria genes and proteins are within this database?
 Specifically, in the database is MT-CYB (4519), MT-ND1 (4535), MT-ND2 (4536), MT-ND3 (4537), MT-ND4 (4538), MT-ND4L (4539), MT-ND5 (4540), MT-ND6 (4541), MT-CO1 (4512), MT-CO2 (4513), MT-CO3(4514), MT-ATP6 (4508), and MT-ATP8 (4509).
Q: How do I search this database?
A: Enter a Gene ID like one from the previous answer, say 4519 into the search bar on the home page.
Q: If I find a bug, how do I report it or have accessibility concerns?
A: Click on the submit bugs and errors here button to be lead to a google form to fill it out. Your error will most likely be fixed.
Q: Where did you obtain your data?
A: Where all of the data was obtained is in the citation page of the website and in the Final Report Paper.


Hours
6:00AM - 8:00PM CLOSED WEDNESDAYS
Locations
Pike Place Market 86 Pike Pl, Seattle, WA 98101 Seattle-Tacoma Intl Airport 17801 International Blvd, Seattle, WA 98158 The Armory at Seattle Center 305 Harrison St, Seattle, WA 98109 Capital Hill 1604 Broadway, Seattle, WA 98122 Alki Beach 1702 Alki Ave SW, Seattle, WA 98116


---
layout: post
title: Astrological wheel
date: '2013-04-03T02:27:00+02:00'
categories:
- Storyboards
- Atoleiros Battle
picture_url: https://film-Storyboards.tumblr.com/post/47008689430/mood-board-for-animatic-astrological-wheel
---
Mood board for animatic - Astrological Wheel.