Ошибка выполнения pRO C в R: Ответ и предиктор должны иметь векторы одинаковой длины - PullRequest
2 голосов
/ 05 февраля 2020

Я назвал регрессию множественной логистики c следующим образом:

step_1 <- glm(CD3LR ~ alb + surg + ASA_opt + BMI + bil + Hb_cat + MDRD + sex + DM
              + age + Path + Smoking,
              na.action = na.exclude, family = binomial)

Когда я хочу протестировать модель путем создания кривой RO C, я использую пакет pRO C и вызовите:

roc(CD3LR, step_1$fitted.values, plot=FALSE)

Однако это возвращает ошибку:

> roc(CD3LR, step_1fitted.values, plot=FALSE) 
Setting levels:control=0,case=1
Error in roc.default(CD3LR,step_1fitted.values, plot = FALSE) : 
  Response and predictor must be vectors of the same length.

Я думаю, это потому, что для переменной MDRD пропущено 3 значения, и потому что я использовал na.exclude это в 3 раза меньше step_1$fitted.values, чем у меня для CD3LR

Есть ли способ создать кривую RO C, используя только значения CD3LR, которые соответствуют step_1$fitted.values? ?

Очень благодарен за любую помощь!

Ответы [ 2 ]

2 голосов
/ 05 февраля 2020

Ваша интуиция верна, некоторые значения были отфильтрованы с помощью na.action=na.exclude.

Обычно я бы рекомендовал использовать функцию predict для получения новых прогнозов данных. Они выглядят так:

> predict(step_1)
1           2           3           4           5           6           7   ...
NA          NA  1.04059269  0.60248768  0.81502210  0.23992288  0.08421514  ...

Как видите, отсутствующие значения в MDRD вместо * удаляются NA.

Затем вы можете передать эти прогнозы непосредственно в Функция ro c:

roc(CD3LR, predict(step_1))
1 голос
/ 05 февраля 2020

Я заметил, что у вас есть все ваши переменные в среде, например, вот так, и ниже я ввожу 3NA для секса и 2 NA для ИМТ,

CD3LR = as.numeric(runif(100)>0.5)
alb = rnorm(100)
surg = sample(1:3,100,replace=TRUE)
ASA_opt = rpois(100,50)
BMI = c(NA,NA,rpois(98,100))
bil = rnorm(100)
Hb_cat = sample(1:3,100,replace=TRUE)
MDRD = runif(100)
sex = c(sample(c("M","F"),98,replace=TRUE),NA,NA)
DM = rnorm(100)
age = sample(20:60,100,replace=TRUE)
Path = rnorm(100)
Smoking = sample(c("Yes","NI"),100,replace=TRUE)

Так что лучше всего поместить их все в data.frame, подгонка, а затем кривая ro c:

DataFrame = data.frame(
CD3LR,alb,surg,ASA_opt,BMI,bil,Hb_cat,
MDRD,sex,DM,age,Path,Smoking) 

step_1<-glm(CD3LR~alb+surg+ASA_opt+BMI+bil+Hb_cat+MDRD+sex+DM+age+Path+Smoking,
data=DataFrame,na.action=na.exclude,family=binomial)

Благодаря @Calimo за указание, вы также можете добавить:

step_1<-glm(CD3LR~.,
data=DataFrame,na.action=na.exclude,family=binomial)

Это дает вам ошибку:

roc(DataFrame$CD3LR,step_1$fitted.values,plot=FALSE)

Мы можем сделать:

roc(step_1$y,step_1$fitted.values,plot=FALSE)

Или:

roc(DataFrame[complete.cases(DataFrame),"CD3LR"],step_1$fitted.values,plot=FALSE)

Причиной наличия фрейма данных является то, что вы можете немедленно увидеть полный набор данных, который не является NA для всех. Если в предикторе или ответе есть какие-либо NA, они не будут использоваться в регрессии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...