gpt4 book ai didi

r - R中的功能内的功能

转载 作者:行者123 更新时间:2023-12-04 22:06:30 26 4
gpt4 key购买 nike

您能否向我解释为什么代码提示说找不到Samdat

我试图在模型之间进行切换,所以我声明了一个包含这些特定模型的函数,我只需要将此函数作为get.f函数中的参数之一进行调用即可,其中重采样将更改模型中每个设计矩阵的结构。该代码提示找不到Samdat

另外,有没有一种方法可以使条件语句if(Model == M1())而不需要创建另一个参数M来设置if(M==1)

这是我的代码:

dat <-  cbind(Y=rnorm(20),rnorm(20),runif(20),rexp(20),rnorm(20),runif(20), rexp(20),rnorm(20),runif(20),rexp(20))
nam <- paste("v",1:9,sep="")
colnames(dat) <- c("Y",nam)

M1 <- function(){
a1 = cbind(Samdat[,c(2:5,7,9)])
b1 = cbind(Samdat[,c(2:4,6,8,7)])
c1 = b1+a1
list(a1=a1,b1=b1,c1=c1)}

M2 <- function(){
a1= cbind(Samdat[,c(2:5,7,9)])+2
b1= cbind(Samdat[,c(2:4,6,8,7)])+2
c1 = a1+b1
list(a1=a1,b1=b1,c1=c1)}

M3 <- function(){
a1= cbind(Samdat[,c(2:5,7,9)])+8
b1= cbind(Samdat[,c(2:4,6,8,7)])+8
c1 = a1+b1
list(a1=a1,b1=b1,c1=c1)}
#################################################################
get.f <- function(asim,Model,M){
sse <-c()
for(i in 1:asim){
set.seed(i)
Samdat <- dat[sample(1:nrow(dat),nrow(dat),replace=T),]
Y <- Samdat[,1]
if(M==1){
a2 <- Model$a1
b2 <- Model$b1
c2 <- Model$c1
s<- a2+b2+c2
fit <- lm(Y~s)
cof <- sum(summary(fit)$coef[,1])
coff <-Model$cof
sse <-c(sse,coff)
}
else if(M==2){
a2 <- Model$a1
b2 <- Model$b1
c2 <- Model$c1
s<- c2+12
fit <- lm(Y~s)
cof <- sum(summary(fit)$coef[,1])
coff <-Model$cof
sse <-c(sse,coff)
}
else {
a2 <- Model$a1
b2 <- Model$b1
c2 <- Model$c1
s<- c2+a2
fit <- lm(Y~s)
cof <- sum(summary(fit)$coef[,1])
coff <- Model$cof
sse <-c(sse,coff)
}
}
return(sse)
}

get.f(10,Model=M1(),M=1)
get.f(10,Model=M2(),M=2)
get.f(10,Model=M3(),M=3)

最佳答案

你打电话的时候

get.f(10, Model=M1(), M=1)

您的 M1函数将立即被调用。之所以死,是因为您在 M1主体内部使用了 Samdat,稍后才在 get.f主体中对其进行定义。

以某种方式,您需要在 M1定义后调用 Samdat。一种实现方法是使 M1(该函数)成为 get.f的参数,然后从 get.f内部调用该函数:
get.f <- function(asim, Model.fun, M) {
...
Sambat <- ...
Model <- Model.fun()
...
}
get.f(10, Model.fun = M1, M=1)

而且,通常来说,使用全局变量是不好的编程,即,使函数使用超出其范围定义的变量。相反,建议将函数使用的所有内容作为输入参数传递。您的代码中有两种情况: M1( M2M3)使用 Samdat,而 get.f使用 dat。它们应该是您的函数的参数。这是您的代码的更好版本。我还没有解决所有问题,因此您需要做更多的工作才能使其正常工作:
M1 <- function(sampled.data) {
a1 <- sampled.data[, c("v1", "v2", "v3", "v4", "v6", "v8")]
b1 <- sampled.data[, c("v1", "v2", "v3", "v5", "v7", "v6")]
c1 <- a1 + b1
list(a1 = a1, b1 = b1, c1 = c1)
}

get.f <- function(dat, asim, Model.fun, offset, M) {
sse <- c()
for(i in 1:asim){
set.seed(i)
Samdat <- dat[sample(1:nrow(dat), nrow(dat), replace = TRUE), ]
Y <- Samdat[, "Y"]
Model <- Model.fun(sampled.data = Samdat)
a2 <- Model$a1
b2 <- Model$b1
c2 <- Model$c1
s <- switch(M, a2 + b2 + c2, c2 + 12, c2 + a2)
fit <- lm(Y ~ s)
cof <- sum(summary(fit)$coef[,1])
coff <- Model$cof # there is a problem here...
sse <- c(sse, coff) # this is not efficient
}
return(sse)
}

dat <- cbind(Y = rnorm(20), v1 = rnorm(20), v2 = runif(20), v3 = rexp(20),
v4 = rnorm(20), v5 = runif(20), v6 = rexp(20),
v7 = rnorm(20), v8 = runif(20), v9 = rexp(20))

get.f(dat, 10, Model.fun = M1, M = 1)

跳出的最后一件事:如果 s的定义(我在 switch()下收集的内容与您使用的 Model相关,那么请考虑将 Models的定义合并在一起:将 s添加到 M1M2M3的列表输出中函数,以便可以将 s定义为 s <- Model$s,然后您可以将 M输入放到 get.f中。

关于r - R中的功能内的功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12227689/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com