双葉杏や初音ミクのスリーサイズ推定問題を解いてきたわけだが、関数化して一般化する。
前回はスリーサイズを独立して推定したのだが、推定したものを初期値として、再び推定したらどうなるだろうと思って再度推定したらあまり変わらなかった。
BWHestimator <- function(vec, niter = 3){ #age, height, weight library(glmnet) data0 <- read.csv("imasPCA.csv", header=TRUE) data1 <- cbind(data0$B, data0$W, data0$H, data0$age, data0$height, data0$weight) data2 <- data1[-32, ] #杏を抜いた p1 <- matrix(c(vec), nr=1) prd1 <- rep(0, 3) #年齢・身長・体重だけから推定する for(i in seq(3)){ glmnet1 <- glmnet(data2[, 4:ncol(data1)], data2[, i]) cv.glmnet1 <- cv.glmnet(data2[, 4:ncol(data1)], data2[, i]) prd1[i] <- predict(glmnet1, as.matrix(p1), s=cv.glmnet1$lambda.min) } prd2 <- matrix(0, niter, 3) prd2[1, ] <- prd1 for(j in 2:niter){ p2 <- c(prd2[j-1, ], p1) #スリーサイズのうち初期値から2サイズを加えて推定し直す for(i in seq(3)){ glmnet1 <- glmnet(data2[, -i], data2[, i]) cv.glmnet1 <- cv.glmnet(data2[, -i], data2[, i]) prd2[j, i] <- predict(glmnet1, matrix(p2[-i], nr=1), s=cv.glmnet1$lambda.min) } } return(apply(prd2, 2, mean)) }
BWHestimator(c(16, 158, 42)) #初音ミク [1] 79.76157 55.72423 80.87331