【问题标题】:Convert a matlab loop to R loop将 matlab 循环转换为 R 循环
【发布时间】:2019-11-07 17:34:09
【问题描述】:

我有一个转换矩阵如下:

        stage1   stage2 stage3   stage4   stage5
stage1 0.967716 0.017084  0.000 0.000000 0.015200
stage2 0.100000 0.500000  0.200 0.100000 0.100000
stage3 0.200000 0.300000  0.300 0.100000 0.100000
stage4 0.000000 0.000000  0.038 0.917498 0.044502
stage5 0.000000 0.000000  0.000 0.000000 1.000000

下面的matlab代码是这个转移矩阵第一行的条件循环

for i=1:1000
    a=unifrnd(0,1);
    if a<=0.967716 
        stage(i)=1;
    else
         if a<=0.9848
             stage(i)=2;
         else

             stage(i)=5;

         end
    end
end

这意味着在 1000 次迭代中,如果条件为真,均匀分布生成的数字将被分配到五个阶段之一。生成的数字先与停留在当前状态的概率进行比较,如果条件不满足则与上一个概率与转移到下一个状态的概率之和(0.967716 + 0.017084)进行比较,以此类推。

现在我想将这些代码转换为 R 代码。因此,如果我有一个跟踪矩阵“f”,则均匀分布生成的数字将分配给该矩阵的元素之一(列等于上述转换矩阵状态(阶段),行等于迭代)。

f&lt;-matrix(NA, nrow=5, ncol=1000)

...

有人可以帮助我吗?

【问题讨论】:

  • 嗨,Meysam,您能否更准确地说明您的问题。您是否已经尝试过解决问题的方法?这是你的第一个 R 代码吗?如果是的话,你可以通过 R 为 Emmanuel Paradis 的初学者学习基础知识。
  • 您好 Rémi Coulaud,感谢您的回复。我几乎是 R 的初学者用户。是的,以前尝试使用以下代码解决此问题并考虑另一个假设示例。感谢您的建议。p

标签: r matlab


【解决方案1】:

你的意思是stage(i)=6;而不是stage(6)=6;

如果是这样,您的 Matlab 代码可以很容易地改写为

stage = discretize(unifrnd(0,1,1000,1),[0,0.92,0.94,0.97,1],[1,2,3,6],'IncludedEdge','right');

R中的代码很相似,你可以在这里找到函数调用 https://www.rdocumentation.org/packages/arules/versions/1.6-4/topics/discretize

【讨论】:

  • 亲爱的朋友,感谢您的回复,是的,这是一个错误。阶段 (i)=6 是正确的。谢谢你。提到的循环是嵌套循环的一部分,我想将其转换为 R 代码。因此,我认为您建议的解决方案不适合嵌套循环。一般来说,我想学习如何将这些代码转换为 R 代码,并将生成的数字从均匀分布(在 1000 次迭代中)分配给矩阵的行和列。
【解决方案2】:

如果我很了解您的问题,您希望对马尔可夫过程的多个阶段进行建模。您的过程需要五个阶段。在您的示例中,您只想对概率定律进行建模以从一个阶段传递到另一个阶段。

我接受了您的尝试并对其进行了修改以使其正常工作。

小心:

在这个例子中,马尔可夫过程没有概率停留在同一阶段。

p <- matrix(NA, ncol=5, nrow=50)
set.seed(123) # It fixed the seed for random generation of your computer. Very useful to reproductible code.
for(i in 1:nrow(p)){
  a<-runif(1, 0, 1) # You want only one uniform random number not five
  if(a <= 0.25){
    p[i, 2] <- 2} # p has n rows and you need to allocate one row by one row, so i is needed
  else if(a<= 0.66){
    p[i, 3] <- 3}
  else if(a <= 0.88){
    p[i, 4]<- 4}
  else{
    p[i, 5] <- 5}}

我对您已经尝试的内容进行了一些更改,因为您有五列,您可以在正确的情况下放一列。这个想法是看看你是否找到了概率,这要归功于模拟概率法则来获得每个阶段。就是说:

0.25 to have 2
0.41 to have 3
0.22 to have 4
0.12 to have 5

感谢这段代码:

n <- 10000
p <- matrix(0, ncol=5, nrow=n)
set.seed(123)
for(i in 1:nrow(p)){
  a <- runif(1, 0, 1)
  if(a <= 0.25){
    p[i, 2] <- 1}
  else if(a<= 0.66){
    p[i, 3] <- 1}
  else if(a <= 0.88){
    p[i, 4]<- 1}
  else{
    p[i, 5] <- 1}}

这给出了这些概率:

 colSums(p) / n
 0.0000 0.2475 0.4173 0.2211 0.1141

有效!希望对你有帮助。

【讨论】:

  • 亲爱的 Rémi Coulaud,您好,感谢您的帮助和建议。没错,我想模拟马尔可夫过程的薮阶段。但如果可能的话,我还有另一个问题。正如您在此示例中提到的,马尔可夫过程不可能停留在同一阶段。在本例中如何考虑?
  • 亲爱的 Meysam,首先如果答案满足您的问题,您可以验证它。其次,您当然可以使用另一个else if 和填充p[i, 1] 来确定保持在同一阶段的概率。
猜你喜欢
  • 2012-11-06
  • 1970-01-01
  • 1970-01-01
  • 2016-09-03
  • 2020-11-02
  • 1970-01-01
  • 2016-01-26
  • 2021-03-12
  • 2014-12-11
相关资源
最近更新 更多