楼主: 舟~翁
12973 12

[问答] 怎么把一段R程序运行多次,输出x的100个数值呢 [推广有奖]

  • 5关注
  • 0粉丝

博士生

26%

还不是VIP/贵宾

-

威望
0
论坛币
15 个
通用积分
7.0488
学术水平
1 点
热心指数
2 点
信用等级
0 点
经验
3110 点
帖子
221
精华
0
在线时间
145 小时
注册时间
2015-10-12
最后登录
2022-7-3

楼主
舟~翁 发表于 2015-12-18 16:58:03 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
   在论坛查到2014年也有人问过这个问题,我照着上面的方法却怎么也弄不对。希望能有好心人解惑
  1. c<-0.1
  2. r<-0.6
  3. u<-round(rnorm(100,0,1),3)
  4. y<-0.6
  5. for(t in 2:100){
  6. y[t]=c+r*y[t-1]+u[t]

  7. f1<-mean(y[-100])
  8. f2<-mean(y)
  9. f3<-sum((y[-100]-f1)*(y[-1]-f2))
  10. f4<-sum((y[-100]-f1)^2)

  11. r1<-f3/f4
  12. }
  13. r1
复制代码
要把这个运行100次,生成100个r1,这样才能统计r1的分布情况。多谢解答
我用了
for(k in 1:10){
x[k,1]<-source("test2.r")$r1}
x}
但是这x输出的值特别奇怪
$x
[1] 1.86 2.12 2.17 2.17 2.29 2.20 2.40 2.58 2.80 2.86 2.71 2.51 2.47 2.51
[15] 2.65 2.79 2.90 3.11 3.23 3.21 3.22 3.28 3.33 3.31 3.33
工作空间我是设好了的,文件就在工作空间里。



二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:R程序 好心人 程序 好心人

沙发
suimong 发表于 2015-12-18 17:19:33
用replicate()
已有 1 人评分论坛币 收起 理由
admin_kefu + 5 热心帮助其他会员

总评分: 论坛币 + 5   查看全部评分

藤椅
jiangbeilu 学生认证  发表于 2015-12-18 22:34:54
1.先建立一个函数
  1. rp100 <- function(){
  2. c<-0.1
  3. r<-0.6
  4. u<-round(rnorm(100,0,1),3)
  5. y<-0.6
  6. for(t in 2:100){
  7. y[t]=c+r*y[t-1]+u[t]}

  8. f1<-mean(y[-100])
  9. f2<-mean(y)
  10. f3<-sum((y[-100]-f1)*(y[-1]-f2))
  11. f4<-sum((y[-100]-f1)^2)

  12. r1<-f3/f4
  13. return(r1)
  14. }
  15. # 设置一个新的变量
  16. x <- vector()
  17. # 重复100次运行,最后的x就是你需要的结果
  18. for(i in 1:100)
  19. x[i] <-rp100()
复制代码
已有 2 人评分论坛币 热心指数 收起 理由
admin_kefu + 30 热心帮助其他会员
求证1加1 + 1 热心帮助其他会员

总评分: 论坛币 + 30  热心指数 + 1   查看全部评分

板凳
舟~翁 发表于 2015-12-18 23:35:24
jiangbeilu 发表于 2015-12-18 22:34
1.先建立一个函数
你好,谢谢你的回答。这里的x <- vector(),括号里是填r1吗?x <-rep(rp100())是这样吗?学编程不久,求仔细解答。我刚刚运行了发觉不可以诶。。。能不能给出完整的代码,表示完全不熟悉啊

报纸
舟~翁 发表于 2015-12-18 23:36:09
suimong 发表于 2015-12-18 17:19
用replicate()
怎么把这个整个代码一下子都弄进去呢,能不能具体给出代码呢,我才学R,不熟悉

地板
jiangbeilu 学生认证  发表于 2015-12-19 10:47:17
舟~翁 发表于 2015-12-18 23:35
你好,谢谢你的回答。这里的x
括号里什么都不用填写,这是指命名一个空向量;
给你的就是完整的代码
是rp100(),我昨天写错了

7
suimong 发表于 2015-12-19 12:29:51
舟~翁 发表于 2015-12-18 23:36
怎么把这个整个代码一下子都弄进去呢,能不能具体给出代码呢,我才学R,不熟悉
x<-replicate(100, {
  把你的代码复制到这里
})

8
cheetahfly 在职认证  发表于 2015-12-21 14:51:27
经过以上各位同学的献计献策,楼主的问题应该已经得到完满的解答了。以下是我自己“没事找事”,希望向各位高手多学习,莫怪,莫怪!

看了楼主的代码,确信楼主是一个刚学R语言的同学,代码中的问题不少,至少我看出来有以下几方面:
1、在t的2:100的循环中,f1、f2、f3、f4、r1被重复计算,耗费很多无谓的时间(可能是笔误);
2、向量y没有一开始指定长度,而是每循环一次增加一次长度,带来额外的寻址时间;
3、正态分布的随机数只需要99个,浪费一个;
4、同样重复模拟事件,与其简单地重复,不如在原有的向量或矩阵增加一个“维度”来解决,这样,比较容易做到向量化;

楼主应该是想模拟“高斯新息AR一阶时间序列”的运行,类似重复问题还可以通过并行计算来增加效率,综合以上,我设计这么一个函数:

  1. tsmont <- function(rep = 100, t = 100, c = 0.1, r = 0.6, cl = NULL, cores = 1) {
  2. # rep是模拟次数,t为时间序列的长度,c、r等是时间序列中的参数,cl是并行计算的参数,cores是CPU内核数目
  3.   if(is.null(cl)) {
  4.     u <- matrix(round(rnorm(rep*(t-1), 0, 1), 3), ncol = rep)  # 一次过产生所需的所有高斯随机数
  5.     y <- matrix(NA, nrow = t, ncol=rep)  # 实现指定y的长度,避免重新分配地址
  6.     y[1,] <- r
  7.     for (i in 2:t) {   # 目前这个循环如何优化我还没有眉目,请大神指导
  8.       y[i,] <- c + r * y[i-1,] + u[i-1,]
  9.     }
  10.    
  11.     y1 <- y[-t,]     # 一次性分配地址,便于后面的计算调用。通过耗费更多内存来增加效率
  12.     y2 <- y[-1,]     # 同上
  13.    
  14.     f1 <- colMeans(y1)
  15.     f2 <- colMeans(y)
  16.     f1 <- matrix(f1, ncol = rep, nrow = t-1, byrow = T)
  17.     f2 <- matrix(f2, ncol = rep, nrow = t-1, byrow=T)
  18.     f3 <- colSums((y1-f1) * (y2 - f2))
  19.     f4 <- colSums((y1-f1)^2)
  20.    
  21.     return(f3/f4)
  22.   }
  23.   else {  #  用递归来做并行计算,需要R自带的parallel包
  24.     results <- clusterCall(cl, tsmont, rep/cores, t, c, r)
  25.     return(unlist(results))
  26.   }
  27. }
复制代码

让我们来看看实际效果:

test.png

为使差别显著,统一用重复模拟100000次。最上面是用的简单重复(f1-f4的计算不在循环内),中间的是用非并行向量化重复模拟,下面的是用并行计算来模拟,时间节约的效果还是很明显的。

最后再次申明,我也是刚学R语言不久(不到一年),很多地方还不成熟,不完善。希望借此机会向高手学习R程序优化的方法,如果有编得不对、无效率的地方,请大神指正。


已有 2 人评分论坛币 学术水平 热心指数 收起 理由
admin_kefu + 30 热心帮助其他会员
suimong + 5 + 5 精彩帖子

总评分: 论坛币 + 30  学术水平 + 5  热心指数 + 5   查看全部评分

9
舟~翁 发表于 2015-12-21 19:03:44
jiangbeilu 发表于 2015-12-19 10:47
括号里什么都不用填写,这是指命名一个空向量;
给你的就是完整的代码
是rp100(),我昨天写错了
非常感谢你的帮助,谢谢!

10
舟~翁 发表于 2015-12-21 19:05:15
cheetahfly 发表于 2015-12-21 14:51
经过以上各位同学的献计献策,楼主的问题应该已经得到完满的解答了。以下是我自己“没事找事”,希望向各位 ...
谢谢,我才开始学不到2个月,断断续续的基本上属于不懂,向你学习,有没有什么经验可以介绍的呢

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-26 04:58