この質問を見た後:Rの数値比較の難しさ
編集できない関数の奥深くにある等価比較に依存しているため、まだ行き詰まっています(または編集できますか?)
ローカル環境で 3 つの数値の合計が 1 になるかどうかをテストしますsum(p)==1 --> TRUE
(次への機能 - これは可能ですか?
詳細: オプティマイザー ( dfoptim package, nmkb
) を使用して事前確率の組み合わせを選択し、それらをモデル フィッティングのために rpart パッケージに送信し、次に検証 (rps
関数) パッケージに送信して、CART モデルにフィードされる事前確率を「最適化」しようとしています。スコアリング - しかし、パッケージのどこかで、合計が 1にならないと考えているrpart
ため、以前の確率がエラーをスローしています。rpart
再現可能な例を次に示します。
require('rpart')
require('verification')
require('dfoptim')
data(iris)
set.seed(1)
tmp1 <- paste0(names(iris),collapse="+")
tmp2 <- gsub("\\+Species","",tmp1)
fmlatext <- paste0("Species~",tmp2)
tree <- rpart(as.formula(fmlatext),data=iris,method="class")
objfun <- function(priors,fmlatext,data){
p <- priors/sum(priors) # turn arbitrary threesome into numbers that sum to 1
p[1] <- 1-(sum(p)-p[1]) # ensure that numbers sum to 1
print(c(p,sum(p)),digits=16)
tree <- rpart(as.formula(fmlatext),data=data,parms=list(prior=p),
method="class")
rpst <- rps(data$Species,predict(tree,data=data))
return(rpst$rpss)
}
nlev <- nlevels(iris$Species)
guess <- seq(nlev)*10
lb <- rep(1,nlev)
ub <- rep(100,nlev)
bestpriors <- nmkb(par=guess,fn=objfun,lower=lb,upper=ub,
control=list(maximize=TRUE),fmlatext=fmlatext,data=iris)
このコードを実行すると、次の出力が得られます。
[1] 0.1666666666666667 0.3333333333333333 0.5000000000000000 1.0000000000000000
[1] 0.4353687449261023 0.2354416940871099 0.3291895609867877 1.0000000000000000
[1] 0.1224920651311070 0.5548713793562775 0.3226365555126156 1.0000000000000000
[1] 0.1268712138061573 0.2390044736120877 0.6341243125817551 1.0000000000000000
[1] 0.35141687748184969 0.57028058689316308 0.07830253562498726 1.00000000000000000
[1] 0.2997590406445614 0.5077659444797995 0.1924750148756391 1.0000000000000000
[1] 0.3598141573675122 0.4350423262345758 0.2051435163979119 0.9999999999999999
Error in get(paste("rpart", method, sep = "."), envir = environment())(Y, :
Priors must sum to 1
私の実際のコードでは、これはデータと推測値に応じて一貫して発生しませんが、実際に発生し、本当に苦痛です。
どうすればこのエラーを回避できますか? 乾杯、R