2015-09-24 94 views
0

我想看看在以下代碼中生成的最佳和最差執行模型的差異。據我所知,我把bc和oc的情況一樣(代碼是用簡單的字符串替換複製粘貼的)。然而,當我到達oc案例的最後幾行時,R說昏暗是錯誤的。 R是正確的,縮放列表不是oc中的列表,而是一個矩陣,而在bc集合中它們是一個列表。我在做什麼,導致bc和oc的縮放列表有不同的類型?據我所知,lda結果列表是相同的類型,當我手動訪問縮放時,它們在每種情況下似乎都是相同的類型,但是當我將相同的函數應用於lda結果列表時,作爲一個列表得到縮放我得到不同的類型?我在這兩種情況下做了什麼不同?

library("MASS") 

all<-read.csv("~/Documents/All BC OC Data.csv") 
filtered<-all[,apply(!is.na(all),2,all)] 

bc.list.of.lists = list(); 

for(i in 1:500){ 
    bcnorm.orig <- subset(filtered,filtered$set %in% c('bc','normal')) 
    c <- nrow(bcnorm.orig[bcnorm.orig$set == 'bc',]) 
    c2 <- nrow(bcnorm.orig) 
    pis <- c(2+sample(c-2,(c-2)/3),c+sample(c2-c,(c2-c)/3)) 
    bcnorm <- bcnorm.orig[-pis,] 
    sds <- sapply(bcnorm,sd) 
    bcnorm <- bcnorm[,sds!=0] 
    bcpredict <- bcnorm.orig[pis,sds!=0] 
    sds <- sapply(bcpredict,sd) 
    bcnorm <- bcnorm[,sds!=0] 
    bcpredict <- bcpredict[,sds!=0] 
    met.lda.bc <- lda(as.formula(paste("bcnorm$set ~ bcnorm$", paste(names(bcnorm)[-c(1,2)], collapse = " + bcnorm$")))) 
    bcnorm <- bcpredict 
    met.lda.bc.values.predicted <- predict(met.lda.bc, as.data.frame(scale(bcnorm[-c(1,2)]))) 
    wrong <- length(which(met.lda.bc.values.predicted$class != bcnorm$set)) 
    bc.list.of.lists[[i]] <- list(wrong=wrong, lda=met.lda.bc) 
} 
bc.errors<-sapply(bc.list.of.lists, "[[", "wrong") 
bc.first<-bc.list.of.lists[order(bc.errors)][1:10] 
bc.first.ldas<-sapply(bc.first, "[[", "lda") 
bc.first.scalings<-apply(bc.first.ldas, 2,function(x)x$scaling) 
bc.first.scalings<-lapply(bc.first.scalings,function(x)x[,1]) 

oc.list.of.lists = list(); 

for(i in 1:500){ 
    ocnorm.orig <- subset(filtered,filtered$set %in% c('oc','normal')) 
    c <- nrow(ocnorm.orig[ocnorm.orig$set == 'oc',]) 
    c2 <- nrow(ocnorm.orig) 
    pis <- c(2+sample(c-2,(c-2)/3),c+sample(c2-c,(c2-c)/3)) 
    ocnorm <- ocnorm.orig[-pis,] 
    sds <- sapply(ocnorm,sd) 
    ocnorm <- ocnorm[,sds!=0] 
    ocpredict <- ocnorm.orig[pis,sds!=0] 
    sds <- sapply(ocpredict,sd) 
    ocnorm <- ocnorm[,sds!=0] 
    ocpredict <- ocpredict[,sds!=0] 
    met.lda.oc <- lda(as.formula(paste("ocnorm$set ~ ocnorm$", paste(names(ocnorm)[-c(1,2)], collapse = " + ocnorm$")))) 
    ocnorm <- ocpredict 
    met.lda.oc.values.predicted <- predict(met.lda.oc, as.data.frame(scale(ocnorm[-c(1,2)]))) 
    wrong <- length(which(met.lda.oc.values.predicted$class != ocnorm$set)) 
    oc.list.of.lists[[i]] <- list(wrong=wrong, lda=met.lda.oc) 
} 
oc.errors<-sapply(oc.list.of.lists, "[[", "wrong") 
oc.first<-oc.list.of.lists[order(oc.errors)][1:10] 
oc.first.ldas<-sapply(oc.first, "[[", "lda") 
oc.first.scalings<-apply(oc.first.ldas, 2,function(x)x$scaling) 
oc.first.scalings<-lapply(oc.first.scalings,function(x)x[,1]) 
+5

你能把你的問題降到最低嗎?它是否可重複使用? –

+0

儘管我可以得到它,但它是可重複的(每次運行都會發生),但我無法提供各種原因的數據。 –

+2

模擬數據。 –

回答

0

事實證明,在定標是不同長度的在大多數情況下,所以lapply製成列表然後,當它們都具有相同的長度它使基質。

真的很煩人,很難追查行爲。