В R противоречивое поведение для прогнозирования при непараметрической логистической регрессии с использованием поли (x,i)
Чтобы найти лучшую логистическую модель, основанную на AIC, я запускаю цикл по немецким кредитным данным из хранилища UCI ( здесь) следующим образом: 1) Я сохраняю данные во фрейме данных с именем "credit" с заголовками от A1 до A16 (с A16 в качестве ответа, и только A2 и A3 в качестве независимых переменных). 2) Запустите следующий код:
credit <-
read.csv("http://archive.ics.uci.edu/ml/machine-learning-databases/credit- screening/crx.data", na.strings="?",col.names=paste0('A',1:16))
#Remove rows with <NA>
credit <- credit[!is.na(credit$A2) & !is.na(credit$A2)&!is.na(credit$A16),]
print(head(credit))
print(tail(credit))
k<-5
pAIC<-c()
pd<-c()
library(splines)
for (i in 1:k){
for (j in 1:k){
if(i==1 & j==1){
optPmodel<-pModel<-
glm(A16 ~poly(A2,i)*poly(A3,j),family=binomial, data=credit)
bestPAIC<-extractAIC(pModel)[2]
pd<-c(pd,extractAIC(pModel)[1])
pAIC<-c(pAIC,bestPAIC)
}else{
pModel<-
glm(A16 ~poly(A2,i)*poly(A3,j),family=binomial, data=credit)
if((tmp<-extractAIC(pModel)[2]) < bestPAIC){
bestPAIC<-tmp
optPmodel<-pModel
}
pd<-c(pd,extractAIC(pModel)[1])
pAIC<-c(pAIC,tmp)
}
}
}
newA2<-seq(mA2<-floor(min(credit$A2)),MA2<-ceiling(max(credit$A2)),by=1)
newA3<-seq(mA3<-floor(min(credit$A3)),MA3<-ceiling(max(credit$A3)),by=1/2)
ii<-c()
jj<-c()
for (i in newA2){
for (j in newA3){
ii<-c(ii,i)
jj<-c(jj,j)
}
}
newPts<-data.frame(A2=ii, A3=jj) #add rows
# build the predictor for all the new points
####### This is where the code crashes:
nlogitPredP<-predict(optPmodel, newPts, type="response")
Первый двойной цикл for выполняется по i и j как в 1:k, так и для каждой из них строится логистическая модель A16 ~ poly(A2,i)*poly(A3,j) и устанавливается в optPmodel, если он имеет лучший AIC, чем текущий optPmodel. Когда я хочу использовать это в предикате, я получаю следующую ошибку:
"Error: variables ‘poly(A2, i)’, ‘poly(A3, j)’ were specified with different types from the fit
In addition: Warning messages:
1: glm.fit: fitted probabilities numerically 0 or 1 occurred
2: glm.fit: fitted probabilities numerically 0 or 1 occurred
3: glm.fit: fitted probabilities numerically 0 or 1 occurred
4: glm.fit: fitted probabilities numerically 0 or 1 occurred
5: glm.fit: fitted probabilities numerically 0 or 1 occurred
6: In Z/rep(sqrt(norm2[-1L]), each = length(x)) :
longer object length is not a multiple of shorter object length
7: In Z/rep(sqrt(norm2[-1L]), each = length(x)) :
longer object length is not a multiple of shorter object length
Я должен отметить, что когда я заменяю poly (A2, i) * poly (A3, j) на B-сплайн bs(A2,df=i)*bs(A3,df=j), код работает нормально. Наконец, когда я изучил optPmodel и понял, что i=5, j=5, я сделал следующее в интерактивном сеансе:
optPmodel1<-glm(A16~poly(A2,5)*poly(A3,5),family=binomial,data=credit)
nlogitPredP<-predict(optPmodel1, newPts, type="response")
Тогда это работает просто отлично. Любое понимание будет оценено.