2015-02-19 12 views
8

Tôi mới dùng R và cái này nằm ngoài tôi. Kịch bản dưới đây sử dụng hai bảng giả (kết quả và đếm) với hai cột (A và B). Tôi đang chạy kiểm tra hoán vị để so sánh kết quả từ A và B. Cụ thể, tôi đang xem kết quả/đếm cho A và B. Cả kết quả và đếm có 20 hàng và tôi đã viết một vòng lặp để chạy kiểm tra hoán vị cho 10 hàng đầu tiên của mỗi, sau đó là 11 đầu tiên, sau đó 12, lên đến 20. Khi nó hoạt động, mà nó làm vào dịp, tôi nhận được một đồ thị khá ở cuối.Lỗi R trong '[<-. Data.frame' ... thay thế có # mục, cần #

#Set up the dummy data - two competing tables (result & count) 
result <- data.frame(matrix(runif(40)*100, nrow=20)) 
names(result)[1] <- paste("A"); names(result)[2] <- paste("B") 
count <- data.frame(matrix(runif(40)*100, nrow=20)) 
names(count)[1] <- paste("A"); names(count)[2] <- paste("B") 
n.iter <- 1e3 

#Run a permutation test 
permtest <- function(result, count) { 
    n <- dim(result)[1] 
# print(n) 
    stat <- function(x, y) abs(diff(range(colSums(x)/colSums(y)))) 
    swap <- function(x, i) { x[i, ] <- cbind(x[, "B"], x[, "A"])[i, ]; return (x) } 
    sim <- replicate(n.iter, { i <- runif(n) < 1/2; stat(swap(result, i), swap(count, i)) }) 
    result.stat <- stat(result, count) 
    p.value <- sum(sim >= result.stat)/length(sim) 
    return(list(sim, result.stat, p.value)) 
} 

#Compute evolution of p-values over time 
p.evol <- data.frame() 
for (i in 10:dim(result)[1]) { 
# print(i) 
    permresults <- permtest(result[1:i,], count[1:i,]) 
    p.value <- permresults[[3]] 
    p.evol <- rbind(p.evol, c(i, p.value, 1-p.value)) 
} 
colnames(p.evol) <- c("day", "p.value", "conf") 
dev.new() 
plot(p.evol[,1],p.evol[,3], type="b", xlab="Day",ylab="Percentage", main="Evolution of Confidence") 

Vấn đề là đôi khi nó không có vấn đề gì, phần lớn thời gian tôi nhận được Error in '[<-.data.frame'('*tmp*', i, , value = numeric(0)) : replacement has 0 items, need 24. Với options(error=traceback) tôi nhận được đầu ra ở đây, mà tôi không hiểu:

f(ngettext(m, "replacement has %d item, need %d", 
     "replacement has %d items, need %d"), m, n * p), domain = NA) 
16: `[<-.data.frame`(`*tmp*`, i, , value = numeric(0)) at errortest.R#16 
15: `[<-`(`*tmp*`, i, , value = numeric(0)) at errortest.R#16 
14: swap(result, i) 
13: is.data.frame(x) 
12: colSums(x) 
11: diff(range(colSums(x)/colSums(y))) at errortest.R#15 
10: stat(swap(result, i), swap(count, i)) at errortest.R#17 
9: FUN(c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L)[[42L]], ...) 
8: lapply(X = X, FUN = FUN, ...) 
7: sapply(integer(n), eval.parent(substitute(function(...) expr)), 
     simplify = simplify) 
6: replicate(n.iter, { 
     i <- runif(n) < 1/2 
     stat(swap(result, i), swap(count, i)) 
    }) at errortest.R#17 
5: permtest(result[1:i, ], count[1:i, ]) at errortest.R#27 
4: eval(expr, envir, enclos) 
3: eval(ei, envir) 
2: withVisible(eval(ei, envir)) 
1: source("errortest.R", echo = F) 

là gì đặc biệt khó hiểu là nó hoạt động đôi khi! Sao có thể như thế được? Tôi cũng nhận thấy rằng khi tôi un-bình luận print(n)print(i) nó có vẻ làm cho nó hoạt động thường xuyên hơn, mặc dù nó có thể thất bại khi họ không bình luận và làm việc khi họ đang có. Xin được cảm ơn trước về sự giúp đỡ!

Trả lời

12

Lỗi này bật lên khi bạn không may mắn và i <- runif(n) < 1/2 chỉ bao gồm FALSE, tức là không có hoán vị nào xảy ra. Bạn cần thêm một kiểm tra trong hàm swap để khắc phục vấn đề này.

+0

Wow. Đúng vậy. Sao bạn tìm hiểu ra được? Cho rằng tôi đang chạy 1e3 lặp lại nó dường như xảy ra rất thường xuyên, vì vậy tôi đoán tôi may mắn khi tôi * không * có được một hàng bao gồm chỉ 'FALSE'. Tôi đã rất thích nhận biết thêm điểm cho 'kiểm tra' nhưng tôi chắc chắn rằng tôi có thể tìm ra từ đây. ;-) –

+3

Traceback đã giúp tôi bản địa hoá mã có vấn đề, và tôi chỉ đặt một loạt các bản in xung quanh địa điểm đó, vì vậy tôi biết biến thể hiện khi xảy ra lỗi. Đây là hàm 'swap' đã sửa đổi:' swap <- function (x, i) {x [i,] <- x [i, c (2,1)]; return (x)} '(nó không cần kiểm tra khi được viết theo cách này) –

+0

Ngọt ngào. Tôi vừa viết 'swap <- function (x, i) {if (sum (i)! = 0) {x [i,] <- cbind (x [," B "], x [," A "]) [i,]}; return (x)} 'nhưng của bạn là, tự nhiên, tốt hơn. Điểm thưởng được tặng ... –

Các vấn đề liên quan