首页 文章

在R中应用函数或循环:不是数字,返回NA

提问于
浏览
1

我正在使用R中的重采样过程(就像引导程序一样) . 我有一个响应/解释变量矩阵,并希望制作该矩阵的999个样本来计算我正在处理它们的平均值,sd和置信区间的每个统计量 . 所以,我写了一个函数来计算并返回一个列表:

mydata <- data.frame(a=rnorm(20, 1, 1), b = rnorm(20,1,1))

myfun <- function(data, n){
  sample <- data[sample(n, replace = T),]
  model1 <- lm(sample[,1]~sample[,2])
  return(list(model1[[1]][[1]], model1[[1]][[2]]))
}

result <- as.numeric()
result <- replicate(99, myfun(mydata, 10))

然后,我有一个矩阵作为我的输出,其中行是统计数据,列是样本(nrow = 2和ncol = 99) . 我需要每行的mean和sd,但是当我尝试使用apply函数或甚至循环时,会显示以下消息:

在mean.default(newX [,i],...)中:参数不是数字或逻辑:返回NA

此外:

is.numeric(result)
[1] FALSE

我发现它很奇怪,因为我从未遇到类似程序的问题 .

有什么想法吗?

4 回答

  • 0

    使用以下内容:

    myfun <- function(dat, n){
      dat1 <- dat[sample(n, replace = T),]
      model1 <- lm(dat1[,1] ~ dat1[,2])
      return(coef(model1))
      }
    
    replicate(99, myfun(mydata, 10))
    
  • 2

    原因是'result'是具有维度属性的198个元素的 list . 我们需要 unlist 'result'并提供维度属性

    result1 <- `dim<-`(unlist(result), dim(result))
    

    然后使用 apply

  • 0

    只需在myfun()函数中用c()替换list()即可

    mydata <- data.frame(a=rnorm(20, 1, 1), b = rnorm(20,1,1))
    
    myfun <- function(data, n){
      sample <- data[sample(n, replace = T),]
      model1 <- lm(sample[,1]~sample[,2])
      return(c(model1[[1]][[1]], model1[[1]][[2]]))
    }
    
    result <- as.numeric()
    result <- replicate(99, myfun(mydata, 10))
    
    apply(result, FUN=mean, 1)
    apply(result, FUN=sd, 1)
    
  • 4

    这对我有用:

    mydata <- data.frame(a=rnorm(20, 1, 1), b = rnorm(20,1,1))
    
    myfun <- function(data, n){
      sample <- data[sample(n, replace = T),]
      model1 <- lm(sample[,1]~sample[,2])
      return(data.frame(v1 = model1[[1]][[1]], v2 = model1[[1]][[2]]))
    }
    
    result <- do.call("rbind",(replicate(99, myfun(mydata, 10), simplify = FALSE)))
    

相关问题