我在R中有一个模型:
> s1 <- toys[1:10000,]
> model <- glm(V11~V2+V3+V5+V7+V8+V9+V10,gaussian,s1)
> model
Call: glm(formula = V11 ~ V2 + V3 + V5 + V7 + V8 + V9 + V10, family = gaussian,
data = s1)
Coefficients:
(Intercept) V2 V3 V5 V7 V8 V9 V10
-0.900106 0.006385 -0.005080 1.006324 0.229282 0.012391 -0.049307 -0.186450
Degrees of Freedom: 9999 Total (i.e. Null); 9992 Residual
Null Deviance: 11050000
Residual Deviance: 121200 AIC: 53340
现在,如何将此R模型编程为C函数? (带链接的RTFM就足够了)
可能我只需要将R模型中的所有系数乘以它们各自的输入并添加所有项来得到最终结果?
float model(float v2, float v3, ... float v10)
{
return -0.900106 * v2 + 0.006385 * v3 + .. + (-0.186450) * v10;
}
我需要不依赖任何外部资源的独立代码
答案 0 :(得分:4)
您要求的是线性回归模型(此处,R glm()
代表广义线性模型,但是当您使用身份链接时,最终会得到线性回归)。 C中有几种可用的实现,例如apophenia库,它具有一组很好的统计函数,包含MySQL和Python的绑定。 GSL和ALGLIB库也有专用算法。
但是,对于轻量级和几乎独立的C代码,我建议您查看snpMatrix BioC软件包源代码中的glm_test.c
。
根据更新后的问题,您似乎更愿意根据一组回归参数预测结果。然后,假设假设模型的一般形式是y = b0 + b1 * x1 + b2 * x2 + ... + bp * xp,其中b0是截距,b1,...,bp是回归系数(从数据估计),计算相当简单,因为它等于加权和:取p个预测值的每个观测值并乘以b(不要忘记截距项!)。
您可以使用R predict()
功能仔细检查结果;这是一个包含两个预测变量的示例,名为V1
和V2
,100个观测值,以及用于预测结果的新值的常规网格(您也可以使用自己的数据):
> df <- transform(X <- as.data.frame(replicate(2, rnorm(100))),
y = V1+V2+rnorm(100))
> res.lm <- lm(y ~ ., df)
> new.data <- data.frame(V1=seq(-3, 3, by=.5), V2=seq(-3, 3, by=.5))
> coef(res.lm)
(Intercept) V1 V2
0.006712008 0.980712578 1.127586352
> new.data
V1 V2
1 -3.0 -3.0
2 -2.5 -2.5
...
> 0.0067 + 0.9807*-3 + 1.1276*-3 # with approximation
[1] -6.3182
> predict(res.lm, new.data)[1]
1
-6.318185