我在R
编写了自己的函数,因为我必须通过二维网格解决问题(这对应于代码中A
和B
的值)并且会喜欢使用outer()
函数来加速代码而不是使用双重for循环。但是,代码返回以下错误,我很难理解:
> outer(A,B,f)
Error in outer(A, B, f) :
dims [product 56] do not match the length of object [1]
我原本希望我的代码返回56个p值,因为这是函数f()
的标量输入返回的值。那么这里是代码:
library(survival)
iter = 20
n = 120
ratio = 2
hr = 0.5
med.C = 3
med.T = med.C/hr
A = c(0.3, 0.5, 0.6, 0.7)
B = c(0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.95)
f = function(A,B){
med.C.P = med.C/A
med.T.P = med.T/A
med.C.N = med.C
med.T.N = med.T
n.T = round(n*ratio/(ratio+1))
n.C = n - n.T
n.T.P = rbinom(1, n.T, B)
n.T.N = n.T - n.T.P
n.C.P = rbinom(1, n.C, B)
n.C.N = n.C - n.C.P
survtime = c(rexp(n.T.P, log(2)/med.T.P), rexp(n.T.N, log(2)/med.T.N), rexp(n.C.P, log(2)/med.C.P), rexp(n.C.N, log(2)/med.C.N))
stuff = data.frame(arm = c(rep("T", n.T), rep("C", n.C)), dx = c(rep("P", n.T.P), rep("N", n.T.N), rep("P", n.C.P), rep("N", n.C.N)), survtime)
fit = survfit(Surv(stuff$survtime)~stuff$arm)
coxfit = coxph(Surv(stuff$survtime)~stuff$arm)
HR = exp(coxfit$coefficients)
p.val=summary(coxfit)$logtest["pvalue"]
return(p.val)
}
所以我想弄清楚如何使用外部命令和我的代码或替代解决方案来快速获得56个p值。我强调我需要快速代码,因为我想让我的网格更精细,并且还将多次运行此代码以获得这些值的复制。
答案 0 :(得分:1)
我的猜测是outer
不适用于您的功能。这是帮助文件的一部分:
使用这两个扩展向量作为参数(加上......中的任何参数)调用FUN。它必须是一个向量化函数(或一个名称),它至少需要两个参数,并返回一个与第一个(和第二个)长度相同的值。
由于您的函数未进行矢量化,因此outer
已用完。 :)
我能够使用apply来实现你的功能:
# add elispses
f = function(A,B, ...){
# keep everything else the same
}
# then apply along with expand.grid
apply(expand.grid(A,B), 1, f, "A"=A, "B"=B)
希望这有帮助。