发起人:Monsieur Z 初入职场

关于留学法国,实习工作,法国生活,欧洲旅游等问题,可发私信或加V:269511008

回复 ( 10 )

  1. statoor
    理由
    举报 取消

    @肖凯@TomHall@统计之都

  2. 刘小双
    理由
    举报 取消

    FinanceR – SegmentFault

    最近一直在关注 一个叫FinanceR的专栏,作者更新速度很快,内容也是对的起业内良心呀。

    链接在此,不要谢我!

  3. nancy
    理由
    举报 取消

    最近在做一个模拟,出现了点问题,没有找出错误在哪儿,请教一下各位大神

    ##产生数据
    generate.data=function(n,n0,c,Tpara) ##n0为非有效样本的个数
    { x=runif(n,0,2)
    z=as.matrix(matrix(rbinom(2*n,1,0.5),nrow=n,ncol=2))
    epsilon=rnorm(n,0,0.1)
    w=as.numeric((x+epsilon)>1)
    Tbeta=Tpara[1]
    Talpha=Tpara[2:3]
    lambda=(z%*%Talpha-1/sqrt(2))^2
    h=exp(Tbeta*x+lambda)
    y=rexp(n,h)
    C=runif(n,0,c)
    T=apply(cbind(y,C),1,min)
    delta=as.numeric(y<=C)
    x1=sample(x,n0,replace=FALSE) ##非有效样本
    eta=rep(1,n)
    for( i in 1:n0)
    { k=which(x==x1[i]) ##记录非有效样本的位置
    eta[k]=0 } ##非有效样本的eta值为0,有效样本eta值为1
    data0=data.frame(cbind(T,delta,x,w,eta,z))
    data=data0[order(data0$T),]
    return(data)
    }

    e.hat=function(beta,alpha,i) ## i表示从第i个个体开始累加 ,beta、alpha待估计
    { a=eta*as.numeric(w==w[i])*exp(beta*x+z%*%alpha)
    b=eta*as.numeric(w==w[i])
    num=sum(a[i:n]) ##分子
    dem=sum(b[i:n]) ##分母
    ehat=num/dem
    return(ehat)
    }

    ##Sfun实现一个向量从当前位置起后面元素累加,用到了函数cumsum,X为向量
    Sfun=function(X)
    { d=sum(X)-cumsum(X)
    n=length(X)
    f=rep(0,n)
    g=d[-n]
    f[1]=sum(X)
    f[2:n]=g
    return(f)
    }

    ##似然函数
    logLfun0=function(theta)
    { beta=theta[1]
    alpha=theta[2:3]
    e=rep(0,n)
    for(i in 1:n)
    { if(eta[i]==1)
    e[i]=0
    else
    e[i]=e.hat(beta,alpha,i)
    }
    e=replace(e,is.na(e),1)
    r=exp(beta*x+z%*%alpha)
    c=eta*r+(1-eta)*e ##中间变量
    L1=sum(delta*(log(c)))
    L2=sum(delta*log(Sfun(c))) ##Sfun为前面已经定义的函数
    logL=L1-L2 ##对数似然函数
    return(logL)
    }

    ##模拟M次
    library(maxLik)
    main=function(M,n,n0,c,Tpara) ##求M次估计的平均值
    { para=matrix(rep(0,3*M),M,3)
    for(i in 1:M )
    { data=generate.data(n,n0,c,Tpara)
    T=data[,1]
    delta=data[,2]
    x=data[,3]
    w=data[,4]
    eta=data[,5]
    z=as.matrix(data[,6:7])
    result=maxLik(logLfun0,start=c(runif(3,-1,1)),method=”NR”)
    para[i,]=round(result$estimate,2)
    }
    m=apply(para,2,mean)

    s=apply(para,2,sd) #标准差

    bias=Tpara-m #偏差

    out=rbind(para,m,s,bias)

    return(para)

    }

    M=20 ##模拟次数

    n=100 ##每次模拟的样本量

    n0=n*0.5 ##非有效样本的个数

    c=2 ##删失比率大概为20%

    Tpara=c(log(2),1,-0.5) ##真实参数,顺序为beta、alpha

    如果我直接用命令:outcome=main(M,n,n0,c,Tpara),R会报错:找不到对象eta.

    如果我不把循环写在main函数里面而是直接用以下命令却没有问题,请假大神这是问什么?

    para=matrix(rep(0,3*M),M,3)

    for(i in 1:M )

    { data=generate.data(n,n0,c,Tpara)

    T=data[,1]

    delta=data[,2]

    x=data[,3]

    w=data[,4]

    eta=data[,5]

    z=as.matrix(data[,6:7])

    result=maxLik(logLfun0,start=c(runif(3,-1,1)),method=”NR”)

    para[i,]=round(result$estimate,2)

    }

    m=apply(para,2,mean)

    s=apply(para,2,sd) ##M次估计的标准差,其中方差除以的是(n-1)

    bias=Tpara-m

    out=rbind(para,m,s,bias)

  4. 赵鹏
    理由
    举报 取消

    必须@自己一下,哈哈。关于R和并行计算的,可以看下ParallelR网站。

  5. 聿先生
    理由
    举报 取消

    @Yuxi Zhu大魔王

  6. 匿名用户
    理由
    举报 取消

    有很多搞生物搞计算的都是大神,比如@Charles Liang。

我来回答

Captcha 点击图片更换验证码