0
  • Я выполняю анализ логистической регрессии с использованием пакета caret.pred() R function caret package errors: "newdata" rows different, "type" not accepted

  • Данные вводятся в виде матрицы 18x6

  • все прекрасно до сих пор, за исключением функции predict().

  • R говорят мне параметр type должен быть raw или prob но raw просто выплевывает точную копию последнего столбца (значения биномиальных переменный). prob дает мне следующую ошибку:

"Error in dimnames(out)[[2]] <- modelFit$obsLevels : length of 'dimnames' [2] not equal to array extent In addition: Warning message: 'newdata' had 7 rows but variables found have 18 rows"

install.packages("pbkrtest") 
install.packages("caret") 
install.packages('e1071', dependencies=TRUE) 
#install.packages('caret', dependencies = TRUE) 
require(caret) 
library(caret) 

A=matrix(
    c(
    64830,18213,4677,24761,9845,17504,22137,12531,5842,28827,51840,4079,1000,2069,969,9173,11646,946,66161,18852,5581,27219,10159,17527,23402,11409,8115,31425,55993,0,0,1890,1430,7873,12779,627,68426,18274,5513,25687,10971,14104,19604,13438,6011,30055,57242,0,0,2190,1509,8434,10492,755,69716,18366,5735,26556,11733,16605,20644,15516,5750,31116,64330,0,0,1850,1679,9233,12000,500,73128,18906,5759,28555,11951,19810,22086,17425,6152,28469,72020,0,0,1400,1750,8599,12000,500,1,1,1,0,1,0,0,0,0,1,0,1,1,1,1,1,1,1 
), 

    nrow = 18, 
    ncol = 6, 
    byrow = FALSE) #"bycol" does NOT exist 
################### data set as vectors 
a<-c(64830,18213,4677,24761,9845,17504,22137,12531,5842,28827,51840,4079,1000,2069,969,9173,11646,946) 
b<-c(66161,18852,5581,27219,10159,17527,23402,11409,8115,31425,55993,0,0,1890,1430,7873,12779,627) 
c<-c(68426,18274,5513,25687,10971,14104,19604,13438,6011,30055,57242,0,0,2190,1509,8434,10492,755) 
d<-c(69716,18366,5735,26556,11733,16605,20644,15516,5750,31116,64330,0,0,1850,1679,9233,12000,500) 
e<-c(73128,18906,5759,28555,11951,19810,22086,17425,6152,28469,72020,0,0,1400,1750,8599,12000,500) 
f<-c(1,1,1,0,1,0,0,0,0,1,0,1,1,1,1,1,1,1) 
###################### 

n<-nrow(A); 
K<-ncol(A)-1; 

Train <- createDataPartition(f, p=0.6, list=FALSE) #60% of data set is used as training. 
training <- A[ Train, ] 
testing <- A[ -Train, ] 
nrow(training) 

#this is the logistic formula: 
#estimates from logistic regression characterize the relationship between the predictor and response variable on a log-odds scale 
mod_fit <- train(f ~ a + b + c + d +e, data=training, method="glm", family="binomial") 
mod_fit 

#this isthe exponential function to calculate the odds ratios for each preditor: 
exp(coef(mod_fit$finalModel)) 

predict(mod_fit, newdata=training) 
predict(mod_fit, newdata=testing, type="prob") 
+0

Просто любопытно, почему вам нужно определить как кадр данных и A ~ F векторов? – zyurnaidi

+0

@zyurnaidi Я сделал это, потому что я сравнивал биномиальную переменную с другими столбцами (f vs a-e). Я не знал другого способа запустить логистическую формулу. Есть ли способ лучше? – user6318255

+0

Конечно, нам нужно только настроить данные как фрейм данных, а затем получить доступ к каждому столбцу по его имени. См. Ответы. – zyurnaidi

ответ

0

Я не очень уверен, что понять, но это матрица (а, б, в, г, д, е). Поэтому вам не нужно создавать два объекта.

install.packages("pbkrtest") 
install.packages("caret") 
install.packages('e1071', dependencies=TRUE) 
#install.packages('caret', dependencies = TRUE) 
require(caret) 
library(caret) 

A=matrix(
    c(
     64830,18213,4677,24761,9845,17504,22137,12531,5842,28827,51840,4079,1000,2069,969,9173,11646,946,66161,18852,5581,27219,10159,17527,23402,11409,8115,31425,55993,0,0,1890,1430,7873,12779,627,68426,18274,5513,25687,10971,14104,19604,13438,6011,30055,57242,0,0,2190,1509,8434,10492,755,69716,18366,5735,26556,11733,16605,20644,15516,5750,31116,64330,0,0,1850,1679,9233,12000,500,73128,18906,5759,28555,11951,19810,22086,17425,6152,28469,72020,0,0,1400,1750,8599,12000,500,1,1,1,0,1,0,0,0,0,1,0,1,1,1,1,1,1,1 
), 
    nrow = 18, 
    ncol = 6, 
    byrow = FALSE) #"bycol" does NOT exist 

A <- data.frame(A) 
colnames(A) <- c('a','b','c','d','e','f') 
A$f <- as.factor(A$f) 

Train <- createDataPartition(A$f, p=0.6, list=FALSE) #60% of data set is used as training. 
training <- A[ Train, ] 
testing <- A[ -Train, ] 
nrow(training) 

И предсказать переменную необходимо ввести объясняющие переменные, а не переменной для прогнозирования

mod_fit <- train(f ~ a + b + c + d +e, data=training, method="glm", family="binomial") 
mod_fit 

#this isthe exponential function to calculate the odds ratios for each preditor: 
exp(coef(mod_fit$finalModel)) 

predict(mod_fit, newdata=training[,-which(colnames(training)=="f")]) 
predict(mod_fit, newdata=testing[,-which(colnames(testing)=="f")]) 
+0

f должен быть фактором, вы пытаетесь создать логистическую регрессию. См. Генерируемые 'warnings()'. 'train (as.factor (f) ~., data = training, method =" glm ", family =" binomial "' – phiver

+0

Да, это правда, но это всего лишь предупреждения, прогнозы одинаковы. Я исправлю. – CClaire

0

Короткий ответ, вы не должны включать в себя объясняемой переменной, которая находится в вашем predict уравнении f. Так что вы должны сделать:

predict(mod_fit, newdata=training[, -ncol(training]) 
predict(mod_fit, newdata=testing[, -ncol(testing]) 

Проблема с предупреждающим сообщением 'newdata' had 11 rows but variables found have 18 rows потому, что вы регрессию, используя весь набор данных (18 наблюдений), но предсказать, используя только его часть (или 11 или 7).

EDIT: Для того, чтобы упростить создание данных и glm процессов мы можем сделать:

library(caret) 
A <- data.frame(a = c(64830,18213,4677,24761,9845,17504,22137,12531,5842,28827,51840,4079,1000,2069,969,9173,11646,946), 
       b = c(66161,18852,5581,27219,10159,17527,23402,11409,8115,31425,55993,0,0,1890,1430,7873,12779,627), 
       c = c(68426,18274,5513,25687,10971,14104,19604,13438,6011,30055,57242,0,0,2190,1509,8434,10492,755), 
       d = c(69716,18366,5735,26556,11733,16605,20644,15516,5750,31116,64330,0,0,1850,1679,9233,12000,500), 
       e = c(73128,18906,5759,28555,11951,19810,22086,17425,6152,28469,72020,0,0,1400,1750,8599,12000,500), 
       f = c(1,1,1,0,1,0,0,0,0,1,0,1,1,1,1,1,1,1)) 

Train <- createDataPartition(f, p=0.6, list=FALSE) #60% of data set is used as training. 
training <- A[ Train, ] 
testing <- A[ -Train, ] 

mod_fit <- train(f ~ a + b + c + d + e, data=training, method="glm", family="binomial")