#r #loops #random-walk
#r #петли #случайное блуждание
Вопрос:
Я хотел бы преобразовать некоторый код MATLAB в R для представления двумерного и трехмерного случайного блуждания.
У меня есть этот интересный код MATLAB из заметок профессора, который я не могу правильно запустить в MATLAB:
%%TWO-DIMENSIONAL RANDOM WALK%% ALERT: NOT WORKING!
n=100000;
colorstr=['b' 'r' 'g' 'y'];
for k=1:4
z=2.*(rand(2,n)¡0.5)-1; %MATLAB does not understand "¡"
x=[zeros(1,2); cumsum(z')];
col=colorstr(k);
plot(x(:,1),x(:,2),col);
hold on
end grid
и
%%THREE-DIMENSIONAL RANDOM WALK%% WORKING FINE
p=0.5;
n=100;
colorstr=['b' 'r' 'g' 'y'];
for k=1:4
z=2.*(rand(3,n)<=p)-1;
x=[zeros(1,3); cumsum(z')];
col=colorstr(k);
plot3(x(:,1),x(:,2),x(:,3),col);
hold on
end
Для двумерного r. walk я нашел -очень большой код в https://stat.ethz.ch/pipermail/r-help/2010-December/261947.html
Однако я хотел бы перевести приведенный выше код на R очень упрощенным способом. То, что я сделал на данный момент, это
%%TWO-DIMENSIONAL RANDOM WALK%%
n<-100000
%%%colorstr=c('b','r','g','y') %hesitating
colorstr=c('brgy')
for(i in 1:4){
z=2*(c(runif(n),runif(n))*0.5)-1
print(z)}
x=(array(0,1);cumsum(z^-1))
Тем не менее, я думаю, что необходимо создать функцию только для вывода результатов.
Кто-нибудь может помочь мне с этой задачей? Все комментарии и полезная помощь будут вознаграждены. Заранее благодарю вас.
Ответ №1:
вот возможное решение для случайного блуждания 2d (3d можно выполнить таким же образом). Я не свободно владею Matlab, поэтому некоторые части кода я не понял.
n <- 100
p <- 1/2
set.seed(1) #set a random seed to make example reproducible.
noise2 <- matrix(sample(c(-1, 1), n*2, replace = T, prob = c(1-p, p)), ncol = 2)
noise2 <- rbind(c(0, 0), noise2)
rw2 <- apply(noise2, 2, cumsum)
plot(rw2, type = "l", col = "dodgerblue", xlab = "", ylab = "", lwd = 2)
Я имитирую шум, не используя runif
но sample
. Это дает мне вектор длины 2n, содержащий только -1 и 1. Я преобразую этот вектор в матрицу с двумя столбцами.
После этого я добавляю строку в верхней части этой матрицы, которая содержит нули.
Наконец, используя apply
и cumsum
я создаю случайное блуждание. Что apply делает, так это применяет функцию cumsum
к каждому столбцу noise2
.
Комментарии:
1. Это действительно помогает! Я бы попробовал сейчас с 3D.
2. Отлично. 3d должно быть таким же (за исключением сюжета, конечно :))