在R,我怎么可以设置特定变量的权重 ,而不是观察lm()
函数?
上下文如下。 我试图建立特定的产品,比方说,对手机个人排名系统。 我可以基于价格为因变量和其它特征,如屏幕大小,存储器,操作系统等作为自变量建立线性模型。 然后我就可以用它来预测手机实际成本(相对于申报价格),从而找到最佳的价格/善良系数。 这是我已经做了。
现在,我想“突出”的某些功能仅是重要的我。 例如,我可能需要一个电话具有大存储器,因此,我想给它更高的权重,使得线性模型对存储器变量优化。
lm()
中的R函数具有weights
参数,但这些都是观察的权重,而不是变量(纠正我,如果这是错误的)。 我也试图玩弄的公式,但只拿到了翻译错误。 有没有纳入权重变量的方式lm()
当然, lm()
函数是不是唯一的选择。 如果你知道如何与其他类似的解决方案做到这一点(如glm()
这是相当精细了。
UPD。 一些评论后,我明白我在想问题的方式是错误的。 线性模型,通过调用获得lm()
给出了训练例子最佳系数,而且也没有办法(也没有必要),以改变变量的权重,遗憾的混乱我做了。 什么实际上,我寻找的是改变系数在现有的线性模型进行一些手动参数比其他人更重要的方式。 继续前面的例子,假设我们已经有了下面的公式价格:
price = 300 + 30 * memory + 56 * screen_size + 12 * os_android + 9 * os_win8
该公式描述了价格和电话参数之间依赖性最佳可能的线性模型。 不过,现在我需要手动更改前面数30 memory
变量,比如,60,所以就变成:
price = 300 + 60 * memory + 56 * screen_size + 12 * os_android + 9 * os_win8
当然,这个公式并不反映价格和手机的参数更多的之间的最佳关系。 也因变量不显示的实际价格,善良的只是一些价值,考虑到内存是我的两倍更重要比一般人(基于第一个公式的系数)。 但善良的这个值(或者,更准确地说,分数值goodness/price
)正是我所需要的-有这个,我可以找到最好的(在我看来)手机最优惠的价格。
希望这一切才有意义。 现在我有一个(可能是很简单的)的问题。 在现有的线性模型如何可以手动设定的系数 ,以获得lm()
也就是说,我在寻找类似:
coef(model)[2] <- 60
此代码不能当然的工作,但你应该明白我的意思。 注:显然可以在短短双值memory
在数据帧列,但我在寻找更好的解决方案,影响模型,而不是数据。
下面的代码是有点复杂,因为lm()
减少剩余平方和,并具有固定的,非最佳系数是不渴望最小的,所以这将是反对什么lm()
正在试图做的唯一途径是修复所有其余的系数了。
要做到这一点,我们必须先知道不受约束模型的系数。 所有调整,通过改变模型的公式来进行,例如我们有price ~ memory + screen_size
,当然有一个隐藏的拦截。 现在不直接修改数据,也没有使用I(c*memory)
是不错的主意。 I(c*memory)
就像是太数据的临时变化,但通过将这些变量会更加难以改变只有一个系数。
所以,首先我们改变price ~ memory + screen_size
到price ~ offset(c1*memory) + offset(c2*screen_size)
但是我们还没有修改拦截,现在会尽量减少残差平方和,并可能变得比原来的模式不同。 最后一步是除去截距和添加新的,假变量 ,即,其具有相同数目的观测值作为其他变量:
price ~ offset(c1*memory) + offset(c2*screen_size) + rep(c0, length(memory)) - 1
# Function to fix coefficients
setCoeffs <- function(frml, weights, len){
el <- paste0("offset(", weights[-1], "*",
unlist(strsplit(as.character(frml)[-(1:2)], " +\\+ +")), ")")
el <- c(paste0("offset(rep(", weights[1], ",", len, "))"), el)
as.formula(paste(as.character(frml)[2], "~",
paste(el, collapse = " + "), " + -1"))
}
# Example data
df <- data.frame(x1 = rnorm(10), x2 = rnorm(10, sd = 5),
y = rnorm(10, mean = 3, sd = 10))
# Writing formula explicitly
frml <- y ~ x1 + x2
# Basic model
mod <- lm(frml, data = df)
# Prime coefficients and any modifications. Note that "weights" contains
# intercept value too
weights <- mod$coef
# Setting coefficient of x1. All the rest remain the same
weights[2] <- 3
# Final model
mod2 <- update(mod, setCoeffs(frml, weights, nrow(df)))
# It is fine that mod2 returns "No coefficients"
此外,可能是您要使用mod2
只为预测(其实我不知道还有什么地方就可以使用现在),以便能以更简单的方式进行,不setCoeffs
:
# Data for forecasting with e.g. price unknown
df2 <- data.frame(x1 = rpois(10, 10), x2 = rpois(5, 5), y = NA)
mat <- model.matrix(frml, model.frame(frml, df2, na.action = NULL))
# Forecasts
rowSums(t(t(mat) * weights))
它看起来像你正在做的优化,而不是模型拟合(虽然有可能是模型拟合内优化)。 你可能想是这样的optim
功能或可考虑线性或二次规划( linprog
和quadprog
包)。
如果你坚持使用建模工具,如lm
然后使用offset
参数在公式中指定自己的multiplyer,而不是计算的。
文章来源: How to manually set coefficients for variables in linear model? [duplicate]