2014-12-09 1 views
0

Просьба привести простой пример. Я в волнении! Я пробовал функцию errorest и делаю это как пример, который он дает для 10-кратного CV LDA. Но когда я использовал свои собственные данные, он просто сказал, что предсказание не является числовым. Я не знаю почему! Спасибо! Код R такой. Я хочу сделать бинарный LDA, поэтому я генерировать данные:Как выполнить CV-тест для изучения ошибки классификации LDA в R

library(MASS) 
n=500 
#generate x1 and x2. 
Sigma=matrix(c(2,0,0,1),nrow=2,ncol=2) 
#Logistic model with parameter{1,4,-2} 
beta.star=c(1,4,-2) 
Xtilde=mvrnorm(n=n,mu=c(0.5,2),Sigma=Sigma) 
X=cbind(1,Xtilde) 
z=X%*%beta.star 
#pass througn an inv-logit function 
pr=exp(z)/(1+exp(z)) 
#Simulate binary response 
# The "probability of respoonse is a vector" 
y=rbinom(n,1,pr) 

Затем я использую LDA, чтобы получить модель:

library(MASS) 
df.cv=data.frame(V1=Xtilde[,1],V2=Xtilde[,2]) 
exper1<-lda(y~V1+V2,data=df.d) 
plda<-predict(exper1,newdata=df.cv) 

Наконец, я хочу использовать резюме с -й исходными данными и см Ошибка. Я делаю это неправильно:

mypredict.lda <- function(object, newdata) 
    predict(object, newdata = newdata)$class 
errorest(y ~ ., data=data.frame(da), model=lda,estimator ="cv", predict= as.numeric(mypredict.lda)) 

Что мне делать, чтобы получить ошибку с CV?

+0

Вы определили 'mypredict.lda' как функцию. Объект не содержит прогнозируемых значений на основе вашей модели. Не пытайтесь принудительно использовать функцию 'as.numeric'. –

ответ

1

Итак, мы начинаем со всем вашим предыдущим кодом настройки поддельные данные

library(MASS) 
n=500 
#generate x1 and x2. 
Sigma=matrix(c(2,0,0,1),nrow=2,ncol=2) 

#Logistic model with parameter{1,4,-2} 
beta.star=c(1,4,-2) 
Xtilde=mvrnorm(n=n,mu=c(0.5,2),Sigma=Sigma) 
X=cbind(1,Xtilde) 
z=X%*%beta.star 

#pass througn an inv-logit function 
pr=exp(z)/(1+exp(z)) 
#Simulate binary response 
y=rbinom(n,1,pr) 

#Now we do the LDA 
df.cv=data.frame(V1=Xtilde[,1],V2=Xtilde[,2]) 

Ниже мы разделим данные на две части; учебный комплект и тестовый набор. Если вы хотите сделать кратную перекрестную проверку на 10, вы должны использовать 0,9 вместо 0,8 (0,8 соответствует 80% поезду, 20% тест, который пять раз кросс проверки)

library(ROCR) 
inds=sample(1:nrow(df.cv),0.8*nrow(df.cv)) 
df.train=df.cv[inds,] 
df.test=df.cv[-inds,] 
train.model = lda(y[inds] ~ V1+V2, data=df.train) 

С обученной модели, мы прогнозируем на тестовом наборе. Ниже я определяю предсказанные значения, а затем оцениваю точность предсказаний. Здесь я использую кривую ROC, но вы можете использовать любую метрику, которая вам нужна, я думаю. Я не понял, что вы подразумеваете под ошибкой.

preds=as.numeric(predict(train.model, df.test)$class) 
actual=y[-inds] 
aucCurve=performance(prediction(preds,actual), "tpr", "fpr") 
plot(aucCurve) 

Площадь под этой кривой ROC является показателем предиктивной точности. Значения, близкие к 1, означают, что у вас хорошая прогностическая способность.

auc=performance(prediction(preds,actual), "auc") 
[email protected] 

Надеюсь, это помогло и не является ужасно неправильным. Другие люди, пожалуйста, звоните с исправлениями или разъяснениями.

Смежные вопросы