[R] Optimisation does not optimise!

Stephen Clark gysc at leeds.ac.uk
Fri Jul 12 22:22:00 CEST 2013


Hello, 

I have the following code and data. I am basically trying to select individuals in a sample (by setting some weights) to match known counts for a zone. This is been done by matching gender and age bands. I have tested the function to be optimised and it does behave as I would expect when the weights are changed. However when I run the optimisation I get the following output 

> optout<-optim(weights0, func_opt, control=list(REPORT=1))
[1] 27164
[1] 27163.8
[1] 27163.8
[1] 27163.8
[1] 27163.8
[1] 27163.8
[1] 27163.8
[1] 27163.8
[1] 27163.8
etc

which suggest an initial change but thereafter the optimisation does not appear to adapt the weights at all. Can anyone see what this is happening and how to make the problem optimise?

sample<-read.csv(file="C:\\sample.csv")
cons1<-read.csv(file="C:\\Gender.csv")
cons2<-read.csv(file="C:\\Age9.csv")
weights0 <- array(dim = c(nrow(sample)))

for (zone in 1:2){
weights0 <- rep(1, nrow(sample))
	optout<-optim(weights0, func_opt, control=list(REPORT=1))
	optout.value
} 

func_opt<-function(weights){
TAE <- 0.0
sumMale <- sum(weights[sample[1:nrow(sample),2]=="Male"])
	sumFemale <- sum(weights[sample[1:nrow(sample),2]=="Female"])

sumAged50to54 <-sum(weights[sample[1:nrow(sample),3]=="Aged 50 to 54"])
sumAged55to59 <-sum(weights[sample[1:nrow(sample),3]=="Aged 55 to 59"])
sumAged60to64 <-sum(weights[sample[1:nrow(sample),3]=="Aged 60 to 64"])
sumAged65to69 <-sum(weights[sample[1:nrow(sample),3]=="Aged 65 to 69"])
sumAged70to74 <-sum(weights[sample[1:nrow(sample),3]=="Aged 70 to 74"])
sumAged75to79 <-sum(weights[sample[1:nrow(sample),3]=="Aged 75 to 79"])
sumAged80to84 <-sum(weights[sample[1:nrow(sample),3]=="Aged 80 to 84"])
sumAged85to89 <-sum(weights[sample[1:nrow(sample),3]=="Aged 85 to 89"])
sumAged90andolder <-sum(weights[sample[1:nrow(sample),3]=="Aged90 and older"])

	TAE <- abs(cons1[zone, 2] - sumMale)
	TAE <- TAE + abs(cons1[zone, 3] - sumFemale)

TAE <- TAE + abs(cons2[zone, 2] - sumAged50to54)
TAE <- TAE + abs(cons2[zone, 3] - sumAged55to59)
TAE <- TAE + abs(cons2[zone, 4] - sumAged60to64)
TAE <- TAE + abs(cons2[zone, 5] - sumAged65to69)
TAE <- TAE + abs(cons2[zone, 6] - sumAged70to74)
TAE <- TAE + abs(cons2[zone, 7] - sumAged75to79)
TAE <- TAE + abs(cons2[zone, 8] - sumAged80to84)
TAE <- TAE + abs(cons2[zone, 9] - sumAged85to89)
TAE <- TAE + abs(cons2[zone, 10] - sumAged90andolder)

print(TAE)
return(TAE)
}

sample.csv
id	sex	        Age10
103712	Female	Aged 50 to 54
103713	Male	Aged 65 to 69
103715	Female	Aged 60 to 64
103716	Male	Aged 65 to 69
103717	Male	Aged 70 to 74
103718	Female	Aged 80 to 84
103721	Female	Aged 65 to 69
103722	Male	Aged 70 to 74
103723	Male	Aged 65 to 69
103724	Female	Aged 60 to 64
103728	Male	Aged 65 to 69
103729	Female	Aged 50 to 54
103730	Male	Aged 75 to 79
103731	Female	Aged 50 to 54
103733	Female	Aged 55 to 59
(this goes on for 10000 individuals)

Gender.csv
Zone	Male	Female
Z1	10547	13234
Z2	16393	18759
Z3	5713		6462
Z4	19651	21834
Z5	26918	33992
Z6	17596	19665

Age9.csv
LA	Aged50to54	Aged55to59	Aged60to64	Aged65to69	Aged70to74	Aged75to79	Aged80to84	Aged85to89	Aged90andolder
Z1	4274	3852	3307	3096	3123	2728	1896	1056	449
Z2	7416	6015	5402	4852	4304	3405	2270	1047	441
Z3	2425	2093	1864	1757	1520	1218	766	376	156
Z4	9236	7713	6013	5257	4696	4072	2702	1293	503
Z5	9655	8841	8199	8252	8375	7559	5511	3198	1320
Z6	7797	7210	5754	4851	4216	3664	2376	994	399



More information about the R-help mailing list