2016-05-11 13 views
0

Ich versuche meine Daten in Trainings- und Testdaten unter Verwendung eines von meinem Professor erhaltenen Codes aufzuteilen, bekomme aber Fehler. Ich dachte, dass es wegen des Datenformats war, aber ich ging zurück, um es zu kodieren und nichts funktioniert. Die Daten sind derzeit in Matrixform und ich glaube, dass der Code verwendet wird, um vorherzusagen, wie genau die logistische Regression ist.Fehler in der multiplen Regression: Anzahl der zu ersetzenden Elemente ist kein Vielfaches der Ersatzlänge

A = matrix(
    c(64830,18213,4677,24761,9845,17504,22137,12531,5842,28827,66161,18852,5581,27219,10159,17527,23402,11409,8115,31425,68426,18274,5513,25687,10971,14104,19604,13438,6011,30055,69716,18366,5735,26556,11733,16605,20644,15516,5750,31116,73128,18906,5759,28555,11951,19810,22086,17425,6152,28469,1,1,1,0,1,0,0,0,0,1), 

nrow = 10, 
ncol = 6, 
byrow = FALSE) 


n<-row(A); 
K<-ncol(A)-1; 
x<-matrix(0,n,K); 

for(i in 1:K){x[,i]<-A[,i];} 
#A[,i] is 10long and x[,i] is 1long. 
A[,i:length(x[,i])]=x[,i] 
y<-A[,K+1]; 
#training/test data split: 
idx<-sample(1:n,floor(n/2),replace=FALSE); 
xtr<-x[idx,]; ytr<-y[idx]; 
xts<-x[-idx,]; yts<-y[-idx]; 
#fit the logistic model to it 
myglm<-glmnet(xtr,ytr,family = "binomial"); 
#Error in if (is.null(np) | (np[2] <= 1)) stop("x should be a matrix with 2 or more columns") : argument is of length zero 

#apply traning data to test data 
mypred<-predict(myglm,newx=xts,type="response",s=0.01); 
posteriprob<-mypred[,,1]; 
yhat<-matrix(1,nrow(xts),1); 
for(i in 1:nrow(xts)) 
{ 
    yhat[i]<-which.max(posteriprob[i,]); 
} 

acc<-sum(yhat+2==yts)/nrow(xts); 
cat("accuracy of test data:", acc, "\n"); 

Die erste forloop gibt mir diese Fehlermeldung: Fehler in x[, i] <- A[, i]:

Number of items to replace is not a multiple of replacement length

Als ich das logistische Modell xtr/ytr mit laufen bekomme ich Fehler in if (is.null(np) | (np[2] <= 1)) stop("x should be a matrix with 2 or more columns"):

argument is of length zero

Antwort

1

Für die erster Fehler, es war ein Tippfehler. Ändern n<-row(A) zu n<-nrow(A) und es hätte funktionieren sollen. Aber danach, A[,i:length(x[,i])]=x[,i] produziert anderen Fehler, da die Größe von A ist 10x6, während die length(x[,i]) ist 10. Probaby wollten Sie hier etwas anderes tun, als was derzeit codiert ist.

Für den zweiten Fehler sollte die xtr eine Größe von mindestens n x 2 haben. Außerdem sind Ihre Daten nicht für Binomial-Glm geeignet. Beobachtungen sollten entweder 1 oder 0 sein.

+0

erster Teil funktioniert jetzt, aber ich dachte, "xtr" hatte bereits die richtige Anzahl von Spalten, weil ich Idx definiert habe? Ich bin verwirrt, weil meine letzte Spalte in der Matrix meine binomischen Daten sein soll. – user6318255

+0

'xtr <-x [idx]' gibt Ihnen einen Vektor. Wahrscheinlich, was Sie wollen, ist 'xtr <-x [idx,]'. Wie auch immer, versuchen Sie, den Code in der Frage zu bearbeiten, wenn Sie könnten, damit wir auf die gleiche Seite gelangen. – zyurnaidi

+0

Das hat funktioniert, aber jetzt habe ich diesen Beobachtungsfehler, den du erwähnt hast. Wie ändere ich die Glmnet-Formel so, dass sie die letzte Binomialspalte meiner Ausgangsmatrix verwendet? Ich habe versucht: myglm <-glmnet (ytr, yts, family = "multinomial"); weil ytr/yts Binomial sind. Ich verstehe, dass ich n x 2 brauche, aber ich habe keine Ahnung, wie man die logistische Regression implementiert, wenn ich diese Formel nicht verwenden kann. – user6318255