문제

60 행과 3036 열이있는 데이터가 설정되어 있습니다.rowQuantiles 패키지에서 matrixStats 함수로 행 퀀 타일을 이미 계산했습니다.이부터는 컬럼 벡터 [60,1]를 얻었습니다.이제는 각 행에서 퀀텀 행보다 높은 데이터 만 선택하고 싶습니다.다음과 같은 기능을 사용하는 경우 :

datset_qu95 = which(dataset > rowQuantiles(dataset, probs=c(0.95))
.

다음은 데이터 치수를 잃고 다음 치수가있는 매트릭스 대신 배열 만 얻습니다 [60,152].

누군가가 나를 도울 수 있습니까?

고맙습니다!

도움이 되었습니까?

해결책

RowQuantile 함수가 필요하다고 생각하지 않습니다.확률 임계 값까지 가장 높은 값을 선택하십시오. (참고 편집 (첫 번째 버전이 잘못된 인덱스 표현식)

> apply( dat, 1, function(x) x[order(x)][1:( (1-0.95)*ncol(dat))])
    obs1     obs2     obs3 
 11.5379 856.3470 136.8860 
.

와 같이 r 행렬은 열 지향적이므로 t()를 사용하여 예상되는 행 방향으로 다시 가져올 수 있습니다.

귀하의 의견에 : 수정되어 가장 낮은 값이 아닌 가장 높은 값을 선택하십시오 :

 apply( dat, 1, function(x)
                  x[order(x, decreasing=TRUE)][1:( (1-0.95)*ncol(dat))])
.

다른 팁

0.05 * 3036 = 151.8하지만 각 행에서 선택하는 것은 95 % 퀀텀보다 큰 값이 체계적으로 152 개의 값을 갖는 것을 의미하지는 않습니다.객체 치수를 유지하려면 원하지 않는 값을 NA의 값을 바꿀 수 있습니다.
귀하의 개체가 거대하지 않으므로 데이터 프레임 개체로 작업하고 행 치수를 따라 관찰을 가질 수 있습니다.

library(matrixStats)

# To extract your values...
myfun <- function(k, q){x[k, x[k,] > q]}
x <- matrix(sample(1:100, 60*3036, replace=TRUE), ncol=3036)
xx <- mapply(myfun, seq(along=x[,1]), rowQuantiles(x, probs=.95))
# xx is a list, xx[[1]] contains the values of x[1,] > quantile(x[1, ], .95)

# The number of selected values depends on their distribution - with NORM should be stable
x11() ; par(mfrow=c(2,1))
hist(sample(1:100, 60*3036, replace=TRUE)) # UNIF DISTRIB
n.val <- sapply(xx, length)
hist(n.val, xlab="n.val > q_95%")
abline(v=152, col="red", lwd=5)

# Assuming you want the same number of value for each row
n <- min(n.val)
myfun <- function(x){sample(x, n)} # Representative sample - Ordering is possible but introduce bias. Depends on your goals
xx <- t(sapply(xx, myfun))
dim(xx) # 60 n
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top