在 R 中应用函数或循环:不是数字,返回 NA
Apply function or Loop in R: Not numerical, returning NA
我正在使用 R 中的重采样程序(就像 bootstrap)。我有一个包含 response/explanatory 个变量的矩阵,我想制作该矩阵的 999 个样本来计算我正在计算的每个统计数据的均值、标准差和置信区间。所以,我写了一个函数来计算 return 一个列表:
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)。我需要每一行的均值和标准差,但是当我尝试使用应用函数甚至循环时,会显示以下消息:
In mean.default(newX[, i], ...) :
argument is not numeric or logical: returning NA
此外:
is.numeric(result)
[1] FALSE
我觉得很奇怪,因为我用类似的程序从来没有遇到过这样的问题。
有什么想法吗?
原因是 'result' 是具有维度属性的 198 个元素的 list
。我们需要 unlist
'result' 并提供维度属性
result1 <- `dim<-`(unlist(result), dim(result))
然后使用 apply
使用以下内容:
myfun <- function(dat, n){
dat1 <- dat[sample(n, replace = T),]
model1 <- lm(dat1[,1] ~ dat1[,2])
return(coef(model1))
}
replicate(99, myfun(mydata, 10))
只需在 myfun() 函数中将 list() 替换为 c()
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)
这对我有用:
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)))
我正在使用 R 中的重采样程序(就像 bootstrap)。我有一个包含 response/explanatory 个变量的矩阵,我想制作该矩阵的 999 个样本来计算我正在计算的每个统计数据的均值、标准差和置信区间。所以,我写了一个函数来计算 return 一个列表:
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)。我需要每一行的均值和标准差,但是当我尝试使用应用函数甚至循环时,会显示以下消息:
In mean.default(newX[, i], ...) :
argument is not numeric or logical: returning NA
此外:
is.numeric(result)
[1] FALSE
我觉得很奇怪,因为我用类似的程序从来没有遇到过这样的问题。
有什么想法吗?
原因是 'result' 是具有维度属性的 198 个元素的 list
。我们需要 unlist
'result' 并提供维度属性
result1 <- `dim<-`(unlist(result), dim(result))
然后使用 apply
使用以下内容:
myfun <- function(dat, n){
dat1 <- dat[sample(n, replace = T),]
model1 <- lm(dat1[,1] ~ dat1[,2])
return(coef(model1))
}
replicate(99, myfun(mydata, 10))
只需在 myfun() 函数中将 list() 替换为 c()
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)
这对我有用:
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)))