Julia 跳跃中Cox比例风险的得分函数

Julia 跳跃中Cox比例风险的得分函数,julia,cox-regression,julia-jump,Julia,Cox Regression,Julia Jump,我在将方程式转换为代码方面不是很有经验。我在将部分似然的分数函数转换为julia中的代码以在JuMP中进行计算时遇到了困难 当β值为0时,其为最大值 我制作了一个简单的小数据集 Using DataFrames, DataFramesMeta, JuMP, Ipopt #build DataFrame times = [6,7,10,15,19,25] is_censored = [1,0,1,1,0,1] x= is_control = [1,1,0,1,0,0] m = Model(sol

我在将方程式转换为代码方面不是很有经验。我在将部分似然的分数函数转换为julia中的代码以在JuMP中进行计算时遇到了困难

当β值为0时,其为最大值

我制作了一个简单的小数据集

Using DataFrames, DataFramesMeta, JuMP, Ipopt
#build DataFrame
times = [6,7,10,15,19,25]
is_censored = [1,0,1,1,0,1]
x= is_control = [1,1,0,1,0,0]

m = Model(solver=IpoptSolver(print_level=0))
using DataFrames

df = DataFrame();
df[:times]=times;
df[:is_censored]= is_censored;
df[:x]=x;
df

#sort df
df_sorted = sort!(df, cols = [order(:times)])

#make df_risk and df_uncensored
df_uncensored = @where(df_sorted, :is_censored .== 0)
df_risk = df_sorted

#use JuMP

##convert df to array

uncensored = convert(Array,df_uncensored[:x])
risk_set = convert(Array,df_risk[:x])
risk_index = convert(Array,find(is_censored .== 0))
x = convert(Array, x)
@variable(m, β, start = 0.0)

# score
@NLobjective(m, Max, sum(uncensored[i] - (([sum(exp(risk_set[j]*β)*x[j]) for j = risk_index[i]:length(risk_set)]) / ([(sum(exp(risk_set[j]*β)*x[j])) for j=risk_index[i]:length(risk_set)])) for i = 1:length(uncensored)))
我得到的错误是

ERROR: exp is not defined for type AffExpr. Are you trying to build a nonlinear problem? Make sure you use @NLconstraint/@NLobjective.
Stacktrace:
 [1] exp(::JuMP.GenericAffExpr{Float64,JuMP.Variable}) at /home/icarus/.julia/v0.6/JuMP/src/operators.jl:630
 [2] collect(::Base.Generator{UnitRange{Int64},##58#60}) at ./array.jl:418
 [3] macro expansion at /home/icarus/.julia/v0.6/JuMP/src/parseExpr_staged.jl:489 [inlined]
 [4] macro expansion at /home/icarus/.julia/v0.6/JuMP/src/parsenlp.jl:226 [inlined]
 [5] macro expansion at /home/icarus/.julia/v0.6/JuMP/src/macros.jl:1086 [inlined]
 [6] anonymous at ./<missing>:?

问题中的代码有点复杂,但以下是提取工作方法相关部分的尝试:

using JuMP, Ipopt

times = [6,7,10,15,19,25];
is_censored = 1-[1,0,1,1,0,1];
is_control = 1-[1,1,0,1,0,0];

uncensored = find(is_censored .== 0)

println("times = $times")
println("is_censored = $is_censored")
println("is_control = $is_control")

m = Model(solver=IpoptSolver(print_level=0))
@variable(m, β, start = 0.0)
@NLobjective(m, Max, sum(log(1+(-1)^is_control[uncensored[i]]* 
  sum((-1)^is_control[j]*exp(is_control[j]*β) for j=uncensored[i]:length(times))/
  sum( exp(is_control[j]*β) for j=uncensored[i]:length(times)))
     for i=1:length(uncensored)))

solve(m)
println("β = ", getvalue(β))
这将产生:

times = [6,7,10,15,19,25]
is_censored = [0,1,0,0,1,0]
is_control = [0,0,1,0,1,1]

β = -1.3261290591982942

β与问题中的β相同,因此我猜对输入的调整是正确的,公式是对数似然。日志中表达式的开头使用了一个常见技巧,即根据0/1值
bool
(-1)^bool

选择+1或-1符号,我以前从未在julia中使用过
$
。这是跳转包的一部分吗?$运算符在Julia中有多种含义,具体取决于上下文。在整数之间是XOR逻辑运算符。在字符串内部是字符串插值。在带引号的表达式(AST,用于元编程)中,它是一个立即求值的子表达式。这些都在文档中,请参见,
times = [6,7,10,15,19,25]
is_censored = [0,1,0,0,1,0]
is_control = [0,0,1,0,1,1]

β = -1.3261290591982942