-1

我仍在学习 R,并且在 R 中写入和读取文件时遇到问题。我要做的是在重新采样时检索我得到共线性的迭代,然后将它们保存到向量中。在第二个代码中使用这个向量来忽略这些迭代并进入下一个迭代。

我的代码中几乎没有错误,请您帮忙并给我更好的方法来做到这一点。但请记住,我需要将 iter 向量保存到文件中,以便以后使用。

这是代码:

a0=rep(1,40)
a=rep(0:1,20)
b=c(rep(1,20),rep(0,20))
c0=c(rep(0,12),rep(1,28))
c1=c(rep(1,5),rep(0,35))
c2=c(rep(1,8),rep(0,32))
c3=c(rep(1,23),rep(0,17))
c4=c(rep(1,6),rep(0,34))
x=matrix(cbind(a0,a,b,c0,c1,c2,c3,c4),nrow=40,ncol=8)

sam <- function(n){
iterlist <- NULL
for(i in 1:n){
set.seed(i)
indx <- sample(1:nrow(x),nrow(x),replace=T)
samx <- x[indx,]
e <- crossprod(samx)
ee <- eigen(e)
evals <- ee$values
Zeval <- which(ifelse(abs(evals)<=1e-7,TRUE,FALSE))
if(length(Zeval)!=0) iterlist <- c(iterlist,i)
}
return(iterlist)
}
iter <- sam(20)
setwd("C:/Users/Sam/Desktop/R")
writeLines(iter)
readLines(iter)
fit <- function(dat,n){
for(i in 1:n){
if(i==iter) next
set.seed(i)
indx <- sample(1:nrow(x),nrow(x),replace=T)
samx <- x[indx,]
fit <- lm(rnorm(nrow(x),i,2*i)~samx-1)
bhat <- coef(fit)
}
return(bhat)
}
fit(x,20)

谢谢

4

1 回答 1

2

为什么不将两个函数合二为一,避免重复相同的代码呢?这样你就不必写出任何东西,读回来,或者做一堆其他的房子清洁项目?

fit()这行代码的函数中也有错误norm(20,i,2*i)

  1. norm只需要两个参数,第一个是数字矩阵,第二个是指定要计算的矩阵类型的字符向量
  2. 也许你的意思是rnorm()相反?如果是这种情况 - 仍然存在错误,因为您创建了 20 个随机数,而samx长度为 40

由于您没有告诉我们,我不知道您真正想做什么,所以我将由您自行解决。

最后 - 这是我将你的两个函数重写为一个的方法。我还重新设计了它们以使用*apply函数而不是你的 for 循环。通过迭代地制作更大的对象,你会让 R 非常快速地爬行。然后你会回来抱怨性能不佳,所以一开始就不要迭代地增长对象!要么预先分配你的存储向量,要么*apply像我在这里做的那样使用一个函数。

sam <- function(i){
    set.seed(i)
    indx <- sample(1:nrow(x),nrow(x),replace=T)
    samx <- x[indx,]
    e <- crossprod(samx)
    ee <- eigen(e)
    evals <- ee$values
    Zeval <- which(ifelse(abs(evals)<=1e-7,TRUE,FALSE))
    if(length(Zeval)==0)  {
      fit <- lm(norm(nrow(samx),i,2*i)~samx-1) #Note the assumption I had to make here
      bhat <- coef(fit)
    } else {
      bhat <- NA
    }
    return(list(bhat = bhat, iter = i))
}

并且在使用中

> lapply(1:4, sam, 20)
[[1]]
[[1]]$bhat
      samx1       samx2       samx3       samx4       samx5       samx6       samx7 
 1.14857203  0.46875434  0.06780226 -0.56521389 -0.81897946 -2.48305129  0.56577183 
      samx8 
 2.34547722 

[[1]]$iter
[1] 1

...
...

[[4]]
[[4]]$bhat
[1] NA

[[4]]$iter
[1] 4

另请注意,n当您定义它时,我从您的 fit 函数中删除了该参数,但后来没有在任何地方使用它。

于 2012-09-22T14:39:18.283 回答