用R中的delta方法估计线性回归截距的标准误差

用R中的delta方法估计线性回归截距的标准误差,r,linear-regression,intercept,R,Linear Regression,Intercept,我试图通过“car”软件包中的“deltaMethod”函数使用delta方法从线性回归中估计转换截距(10^a)的SE。但deltaMethod总是为截距的SE或其任何变换提供零!例如,对于未转换的截取: > x <- 1:100; y <- rnorm(100, 4*x, 5) > m1<-lm(y~x) > library(car) > deltaMethod(m1, "Intercept") Estimate SE

我试图通过“car”软件包中的“deltaMethod”函数使用delta方法从线性回归中估计转换截距(10^a)的SE。但deltaMethod总是为截距的SE或其任何变换提供零!例如,对于未转换的截取:

> x <- 1:100; y <- rnorm(100, 4*x, 5)
> m1<-lm(y~x) 
> library(car)
> deltaMethod(m1, "Intercept")
          Estimate      SE   2.5 %  97.5 %
Intercept  -1.9561  0.0000 -1.9561 -1.9561
“msm”包中的函数“deltamethod”给出了截取SE的正确值:

> library(msm)
> deltamethod (~ x1, coef(m1), vcov(m1))
[1] 0.9034276

但是我在“car”包中的“deltaMethod”函数代码有什么问题?(出于某种原因,我更喜欢使用“汽车”套装而不是“msm”)。谢谢大家!

我似乎无法重现您的问题。我们可以测试这一点的一种方法是编写一个函数,重复创建数据、拟合模型并返回SEs,就像上面所做的那样。我们可以将其传递给
replicate
函数,并多次重复该过程。以下是使用代码进行调查的一种方法:

set.seed(42)

library(car)

delta_sim <- function(){
  x <- 1:100; y <- rnorm(100, 4*x, 5)
  m1<-lm(y~x) 
  a <- deltaMethod(m1, "Intercept")
  list(a)
}

out <- replicate(1000, delta_sim())

out <- do.call(rbind, out)

hist(out$SE)

set.seed(42)
图书馆(汽车)

delta_-sim看来,问题出在我的R或PC上,而不是“汽车”软件包上。是的,我重新启动了R。我甚至将R和我的所有软件包更新为最新版本。唉,错误依然存在:“car”始终显示正确的截距(或其转换),但始终为其提供SE=0。看来我得用msm了。总的来说,这并不重要,但我只是好奇它是什么类型的bug。

我也有同样的问题。使用MDEWITT提供的代码在我的机器上生成了全零。我追踪到了
car::deltaMethod.default的以下部分

    para <- object         
    para.names <- names(para)
    para.names[1] <- gsub("\\(Intercept\\)", "Intercept", para.names[1])
    g. <- parse(text = g.)
    q <- length(para)

    envir <- new.env(parent=envir)
    for (i in 1:q) {
        assign(para.names[i], para[i], envir)
    }
    if(!missing(constants)){
     for (i in seq_along(constants)) assign(names(constants[i]), constants[[i]], envir)}
    est <- eval(g., envir)
    names(est) <- NULL
    gd <- rep(0, q)
    for (i in 1:q) {
        gd[i] <- eval(D(g., names(para)[i]), envir)
    }

生成了所需的输出。

这对我很有用(我从未得到0)。重启R后你有没有试过?只是想让你知道我也遇到了同样的问题。我还没能找到问题根源的答案。实际上,我最初对评估1/(截距)的标准误差感兴趣,但deltaMethod报告了零标准误差,然后我尝试获得(截距)的标准误差,也得到了零标准误差。因此,我用msm软件包中的溴氰菊酯法和分析溶液得出了1/(截距)的标准误差,两者都一致,当然也不同于零。让我担心的是另一个
    para <- object         
    para.names <- names(para)
    para.names[1] <- gsub("\\(Intercept\\)", "Intercept", para.names[1])
    g. <- parse(text = g.)
    q <- length(para)

    envir <- new.env(parent=envir)
    for (i in 1:q) {
        assign(para.names[i], para[i], envir)
    }
    if(!missing(constants)){
     for (i in seq_along(constants)) assign(names(constants[i]), constants[[i]], envir)}
    est <- eval(g., envir)
    names(est) <- NULL
    gd <- rep(0, q)
    for (i in 1:q) {
        gd[i] <- eval(D(g., names(para)[i]), envir)
    }

    set.seed(42)
    
    library(car)
    
    delta_sim <- function(){
      x <- 1:100; y <- rnorm(100, 4*x, 5)
      m1<-lm(y~x) 
      a <- deltaMethod(m1, "b0", parameterNames=c("b0", "b1"))
      list(a)
    }
    
    out <- replicate(1000, delta_sim())
    
    out <- do.call(rbind, out)
    
    hist(out$SE)