0

SnowFall を使用して、クラスターを使用してコードを高速化しようとしています。私のコードの単純化されたバージョンは次のようになります

library(snowfall)
pbsnodefile = Sys.getenv("PBS_NODEFILE")
machines <- scan(pbsnodefile, what="")
machines
nmach = length(machines)
nmach

sfInit(parallel=TRUE,type='SOCK',cpus=nmach,socketHosts=machines)

examp <- function(W,Y){       
    guess=lm(Y~W)
    return(guess$coef)
}

makedat <- function(N){
###Generating a dataset.
#Covariate vector
W <- mvrnorm(N,mu = rep(0,2),Sigma = matrix(c(1,0.8,0.8,1),nrow = 2))
Y <- rnorm(N)  
result <- data.frame(W = W,Y= Y)
return(result)
}

sfExport("examp")                                                                                                                    
sfExport("makedat") 
sfLibrary(MASS)


wrapper <- function(sim){
data <- makedat(100)
result <- examp(W = cbind(data[,1],data[,2]),Y = data[,3])
return(result)
}

nSim <- 2

result = sfLapply(1:nSim,wrapper)
save(result)

sfStop()

これの目的は、lm オブジェクト (guess$coef) の係数のみを出力することでしたが、得られる出力は lm オブジェクト全体です。したがって、 $ が機能していないようです。コードの後半で (ここには含まれていませんが、同じ問題が発生しています。つまり、$ が機能していないようです)。すべての提案は大歓迎です。

4

1 に答える 1

1

モデルから係数を取得しようとしているだけの場合は、次を使用できます。

coef(guess)[2] 

これにより、2 番目の係数である勾配が取得されます。

OPへのフォローアップコメント(私はここで初めてなので、実際に別の関連する質問に新しい情報を追加するかどうか確信が持てなかったので、これが間違っていたかどうか教えてください!):

その構造を理解するために、最初に何かをオブジェクトにする方が簡単だと思います。?nlm() にある例に従います。

f <- function(x) sum((x-1:length(x))^2)
nlm(f, c(10,10))
nlm(f, c(10,10), print.level = 2)
utils::str(nlm(f, c(5), hessian = TRUE))

f <- function(x, a) sum((x-a)^2)
nlm(f, c(10,10), a = c(3,5))
f <- function(x, a)
{
res <- sum((x-a)^2)
attr(res, "gradient") <- 2*(x-a)
res
}
nlm(f, c(10,10), a = c(3,5))

###HOW TO ACCESS THE ESTIMATE###
#making the nlm() output an object:
nlm.obj<- nlm(f, c(10,10), a = c(3,5))
#checking the structure
str(nlm.obj) #a list
nlm.obj[[2]]  #accessing estimate
nlm.obj[[2]][1] #accessing the first value within the estimate

誰でも、この回答の質についてコメントしてください。将来、より良い方法で支援できるようになります。

于 2013-12-06T22:38:26.457 に答える