나는 t- 분포에서 두 개의 벡터를 그린다. 즉 X와 엡실론과 조건에 따라 이들로부터 벡터로 Y를 생성한다. 여러 샘플을 시뮬레이션하는 것을 목표로합니다. 10,000 개의 샘플을 시뮬레이션하면 컴퓨터가 완료되는 데 오랜 시간이 걸립니다. for 루프를 피하여 계산 시간을 줄이고 싶습니다. 몇 가지 시도했지만 작동하지 않았습니다. for 루프를 피하고이 특정 for 루프에 대한 계산 시간을 줄이는 방법은 무엇입니까? 코드는 다음과 같습니다.
X <- rt(1250,5)
eps <- rt(1250,5)
Y <- replicate(1250,0)
for(i in 1:1250) {
if(X[i]>quantile(X, 0.5)){
Y[i] = X[i] + eps[i]
}
else {
Y[i] = 1.5*X[i] + eps[i]
}
}
quantile(X,0.5)
매번 다시 계산하지 마십시오 . 절대 변경되지 않으며 한 번 계산하고 저장된 값을 재사용합니다.
벡터화 된 연산을 사용하여 비교 및 할당이 한 번에 전체 벡터에서 발생할 수 있음을 알고 있습니다. 다음과 같이 줄일 수 있습니다.
X <- rt(1250,5)
eps <- rt(1250,5)
med <- quantile(X, 0.5)
Y <- ifelse(X > med, 1, 1.5) * X + eps
여기에 설명 된 벡터화 된 작업에 대한 빠른 안내 :
set.seed(42)
X <- rt(10, 5)
eps <- rt(10, 5)
med <- quantile(X, 0.5)
X
# [1] 1.9151 0.0878 -0.0773 -0.0618 -0.0480 5.0230 1.0924 0.8423 1.5165
# [10] -0.2601
eps
# [1] 0.712 -1.048 2.233 -0.737 -1.273 -0.890 0.395 -1.828 -0.601 -0.392
med
# 50%
# 0.465
벡터를 스칼라 (또는 길이가 같은 벡터)와 비교하면 논리 / 부울 벡터를 얻습니다.
X > med
# [1] TRUE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE FALSE
이로부터 ifelse
벡터화 된 조건부입니다. if (...) {...} else {...}
한 번에 하나의 길이 -1 논리를 다룰 수 있지만 한 번 ifelse
에 벡터에서 작동합니다. 예를 들면 :
ifelse(c(T, F, F, T), 1:4, 11:14)
# [1] 1 12 13 4
다시 예제로 돌아가서 ifelse
수학 연산을 계속 하고 추가합니다.이 연산은 벡터에서 스칼라로도 잘 작동합니다.
ifelse(X > med, 1, 1.5)
# [1] 1.0 1.5 1.5 1.5 1.5 1.0 1.0 1.0 1.0 1.5
ifelse(X > med, 1, 1.5) * X
# [1] 1.9151 0.1318 -0.1160 -0.0926 -0.0720 5.0230 1.0924 0.8423 1.5165
# [10] -0.3902
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다