我的自定义函数出现“下标越界”错误?

时间:2017-09-29 19:14:53

标签: r function lm

大家好。因此,我决定尝试编写一个简单的自定义函数,对某些lm()进行t检验 - 生成回归的估计量(例如,H_0:Beta_j =“某个常数”vs H_1:Beta_j<“some constant” )。 这是我第一次创建自己的代码,但是我已经和R一起工作了几个月,我觉得我对它有一个很好的理解,所以我不明白为什么我在运行时不断得到“下标超出界限”它

我的代码:

custom_test<-function(data,coeff,alt,alternative=c("two.sided","greater","less"),clevel=.95){
  dof<-data$df.residual
  top<-data$coefficients["coeff"]-alt
  bottom=coef(summary(data))["coeff","Std. Error"]
  stat<-abs(top/bottom)
  if (alternative=="two.sided") {
    tstat<-qt(clevel/2,dof)
    pstat<-2*pt(tstat,dof)
    return(pstat)
  } else if (alternative=="greater") {
      tstat<-qt(clevel/2,dof)
      pstat<-pt(tstat,dof)
      return(pstat)
  } else if (alternative=="less") {
      tstat<-qt(clevel/2,dof)
      pstat<-pt(tstat,dof)
      return(pstat)
  } else {
      return("Error")
  }

}

我尝试使用标准lm()结果运行此项,hrsemp为var。并获得错误:

custom_test(fit9,hrsemp,0,alternative="less")
Error in coef(summary(data))["coeff", "Std. Error"] : 
  subscript out of bounds

但每次我自己手动运行有问题的代码时,我都会得到答案:

> coef(fit9)
(Intercept)      hrsemp  log(sales) log(employ) 
12.45837237 -0.02926893 -0.96202698  0.76147045 
> coef(summary(fit9))["hrsemp", "Std. Error"]
[1] 0.02280484

关于这个错误的其他堆栈交换问题似乎都略有不同,到目前为止我还没能将他们的课程概括为我的代码。

请有人解释我哪里出错了?

1 个答案:

答案 0 :(得分:1)

Frank是对的;你得到这个错误的原因与其他所有人一样在基数:你试图访问一个不存在的对象的元素。更具体地说,在您的情况下,您尝试访问"coeff"的{​​{1}}行和"Std. Error"列中的元素。这是一个问题,因为可能没有名为coef(summary(data))的系数。您想要执行以下操作:

"coeff"

并将变量名称作为字符串传递:

custom_test<-function(data,coeff,alt,alternative=c("two.sided","greater","less"),clevel=.95){
    dof<-data$df.residual
    top<-data$coefficients[coeff]-alt
    bottom=coef(summary(data))[coeff,"Std. Error"]
    stat<-abs(top/bottom)
    if (alternative=="two.sided") {
        tstat<-qt(clevel/2,dof)
        pstat<-2*pt(tstat,dof)
        return(pstat)
    } else if (alternative=="greater") {
        tstat<-qt(clevel/2,dof)
        pstat<-pt(tstat,dof)
        return(pstat)
    } else if (alternative=="less") {
        tstat<-qt(clevel/2,dof)
        pstat<-pt(tstat,dof)
        return(pstat)
    } else {
        return("Error")
    }

}

(请注意,您也可以将函数提供给实际变量对象并使用set.seed(42) hrsemp <- rnorm(10) Y <- 1 + 5 * hrsemp + rnorm(10) fit9 <- lm(Y ~ hrsemp) custom_test(fit9, 'hrsemp', 0, alternative="less") [1] 0.475 - 例如,请参阅this SO question)。

但是,您可能会注意到这会给您错误的答案。那是因为你错误地写了你的功能。你可能想要更像这样的东西:

deparse(substitute(coeff))

为什么这是正确的计算的许多好解释之一可以找到here