xiaohangzi

  • 2023年10月3日
  • 注册于 2022年6月12日
  • nan.xiao
    哈哈,在这里遇上了校友师兄。
    我也是在安装R包 FHDQR上遇到了问题,目前我的R语言版本是R 4.x,但是FHDQR是在R 3.x上编译的。论文作者提供的网址也只有二进制。想问下有没有好的解决办法呢,比如如何完美切换到R 3.x下使用,试了下各位版主的建议,对于新手小白不太成功,或者可以从得到的二进制文件里获取.r 文件(源代码)吗

  • 有些R包当前的R版本已经不能够适应该包,而重新下载新的R语言版本太麻烦,涉及到太多R包的下载还费时间,请问该如何解决这个问题呢(最好是不影响不同版本之间包的使用)

  • 请问R语言如何用lars包中的LASSO方法进行变量选择?我在做的过程中出现Cp值为空,R-square为1,但是参数估计值并不接近真实值,正确的做法应该怎么做?

    library(MASS) #generate random number
    library(lars)#LASSO
    cov_mat<-function(p)
    {
    covm<-matrix(0,p,p)
    for (i in 1:p)
    {
    for (j in 1:p)
    {
    covm[i,j]<-0.5^(abs(i-j))
    }
    }
    return(covm)
    }
    p<-10
    n<-200
    set.seed(666)
    epsilon<-rnorm(n,0,1)
    beta<-c(1,1.5,2,1,0,0,0,0,0,0)
    set.seed(666)
    x<-mvrnorm(n,rep(0,p),cov_mat(p))
    y<-x%*%beta+epsilon
    LASSOres<-lars(as.matrix(x),as.matrix(y),type="lasso")
    结果如下
    LASSOres

    Call:
    lars(x = as.matrix(x), y = as.matrix(y), type = "lasso")
    R-squared: 1
    Sequence of LASSO moves:


    Var 3 2 1 4 7 9 8 6 5 10
    Step 1 2 3 4 5 6 7 8 9 10

    LASSOres$beta[10,]
    [1] 0.81909408 1.28566343 1.71271692 0.52252613 -0.02578134 -0.19780722 -0.19525537 -0.12094906
    [9] -0.16279040 0.00000000

  • 最近在编写代码时,论文提及到使用R中的constrOptim.nl来求解约束条件下的非线性方程组。查看相关文档发现constrOptim.nl求解的似乎是用于未知数是一维的情况,请问,如何求解未知数是向量或者矩阵形式的非线性方程组?
    例如,优化问题为
    min z=(1-x1^2)+100(x2-x1^2)^2
    s.t: x1^2+x^2<=4
    x1/x2>=2

    R语言实现为
    library(alabama)
    obj.f<-function(x){
    x1<-x[1]
    x2<-x[2]
    (1-x1^2)+100(x2-x1^2)^2
    }
    hin.f<-function(x){
    x1<-x[1]
    x2<-x[2]
    c(-x1^2-x2^2+4,x1/x2-2)
    }
    #par为参数初值,obj.f为将要求解的目标函数,gr.f为目标函数的梯度,hin.f为不等式约束
    constrOptim.nl(par=c(1,0.3),obj.f,gr.f,hin.f)

    这里求出来的x[1],x[2],x[3]都是一维的,请问如果我的x[1],x[2],x[3]都是向量或者 矩阵应该如何利用constrOptim.nl求解?(就像线性方程一样y=xb+e,b都是向量)

    • fenguoerbian
      谢谢楼主的耐心解答,确实是我没有表述清楚需求,我下次注意。我想生成的随机变量来自不同的分布,例如epsilon<-rnorm(n,0,1),X1<-runif(n,0,1),X23<-mvrnorm(n,rep(0,2),matrix(c(1,0.5,0.5,1),2,2)),我想保证的是epsilon,X1,X23这几个变量的结果可复现。目前我的做法是在每一次生成随机数时都加上set.seed,但我想的是如果想生成的随机变量很多个,如何减少写set.seed次数。
      `> seednum<-666

      set.seed(seednum);epsilon<-rnorm(n,0,1)
      set.seed(seednum);X1<-runif(n,0,1);
      set.seed(seednum);X23<-mvrnorm(n,rep(0,2),matrix(c(1,0.5,0.5,1),2,2))`

    • zaq
      好的呢,我理解啦。我好像没有表述清楚,就是有没有办法保证X和X1是一样的呢。
      除了在每组随机数前面都设置随机数种子。

    • chuxinyuan

      谢谢呀我试过这样,但是有没有办法减少写set.seed()这个语句的次数呢。就比如说我只写一次set.seed()就可以保证所有的随机数都来自同一组种子

    • zaq
      这样肯定是不行的喔,种子数只能保证一次随机数复现。比如这里的X和X1是不一样的。
      rm(list = ls())

      set.seed(10)
      x = rnorm(10)
      y = runif(10,1,4)
      x1 = rnorm(10)
      x
      [1] 0.01874617 -0.18425254 -1.37133055 -0.59916772 0.29454513 0.38979430
      [7] -1.20807618 -0.36367602 -1.62667268 -0.25647839
      x1
      [1] 0.08934727 -0.95494386 -0.19515038 0.92552126 0.48297852 -0.59631064
      [7] -2.18528684 -0.67486594 -2.11906119 -1.26519802

      • zaq 回复了此帖
      • 请问R语言怎么设置全局随机数种子?
        同一个脚本要产生很多组随机数,怎么保证所有的随机数来自同一组种子?
        set.seed只能保证产生的第一组随机数可复现,但再产生第二组时随机数就不同了