Вычислить наклон линии линейной регрессии

#r #apply

#r #применить

Вопрос:

Я вычисляю наклон во фрейме данных, но у меня проблема с возвратом исходного значения при разных размерах области. мой фрейм данных в формате dput приведен ниже.

Мой текущий подход заключается в том, чтобы сделать это:

 coefLM <- function(x) {
  coef(lm(log(mean) ~ log(area), tar.un_sap.10[-1,]))[2]
}
  

И этот код выдает следующую проблему:

 tar.un_sap.10$slope=apply(tar.un_sap.10[,1:n],1,coefLM)
  
 > head(tar.un_sap.10$slope)
[1] 0.02201471 0.02201471 0.02201471 0.02201471 0.02201471 0.02201471
  

Вот мой фрейм данных:

 > dput(tar.un_sap.10)
structure(list(X1 = c(0, 209, 249, 127, 275, 204, 254, 121, 303, 
275, 231, 200, 293, 261, 196, 287, 212, 261, 300, 260, 249, 297, 
297, 270, 297, 248, 260, 262, 279, 288, 233, 232, 229, 252, 271, 
264, 260, 257, 255, 246, 265, 252, 259, 251, 258, 255, 254, 256, 
254, 320), X2 = c(0, 267, 266, 100, 300, 219, 300, 202, 114, 284, 
264, 247, 271, 249, 287, 290, 244, 268, 231, 264, 282, 222, 276, 
282, 297, 285, 246, 290, 262, 280, 233, 243, 238, 266, 271, 263, 
267, 258, 264, 249, 258, 260, 260, 259, 259, 254, 256, 254, 254, 
320), X3 = c(0, 179, 300, 278, 232, 224, 57, 268, 289, 264, 291, 
288, 178, 289, 187, 258, 287, 241, 259, 268, 242, 265, 260, 268, 
280, 277, 278, 249, 277, 251, 238, 242, 234, 268, 265, 280, 267, 
277, 273, 246, 266, 252, 256, 259, 263, 254, 254, 256, 254, 320
), X4 = c(0, 250, 117, 186, 283, 284, 280, 205, 281, 260, 285, 
243, 294, 214, 246, 252, 193, 231, 296, 300, 279, 264, 289, 262, 
265, 270, 283, 225, 278, 265, 285, 262, 272, 277, 265, 264, 280, 
259, 270, 271, 265, 262, 252, 260, 259, 254, 255, 257, 254, 320
), X5 = c(0, 190, 285, 201, 275, 136, 255, 159, 245, 281, 223, 
231, 297, 267, 211, 300, 262, 299, 221, 286, 297, 275, 252, 262, 
283, 267, 255, 248, 276, 223, 267, 242, 247, 242, 266, 282, 267, 
276, 274, 267, 258, 261, 261, 300, 260, 256, 255, 258, 253, 320
), X7 = c(0, 292, 51, 208, 263, 270, 180, 266, 270, 296, 188, 
295, 125, 223, 287, 237, 299, 223, 242, 268, 281, 240, 288, 297, 
265, 247, 229, 251, 241, 271, 266, 241, 240, 266, 281, 280, 260, 
251, 249, 246, 258, 259, 260, 262, 260, 254, 254, 256, 254, 320
), X8 = c(0, 280, 280, 100, 285, 220, 293, 277, 298, 305, 298, 
292, 269, 255, 223, 259, 296, 248, 277, 265, 297, 288, 259, 291, 
259, 255, 234, 292, 283, 279, 215, 272, 277, 266, 248, 274, 276, 
263, 249, 270, 251, 246, 253, 259, 258, 255, 257, 256, 254, 320
), X9 = c(0, 249, 290, 143, 252, 116, 217, 291, 280, 255, 188, 
273, 240, 254, 253, 280, 282, 285, 282, 249, 286, 252, 260, 234, 
239, 273, 269, 281, 235, 261, 250, 247, 265, 246, 273, 280, 257, 
267, 264, 273, 258, 232, 260, 259, 262, 254, 254, 254, 255, 320
), X10 = c(0, 307, 73, 19, 303, 174, 164, 237, 244, 247, 249, 
286, 188, 301, 210, 295, 281, 268, 230, 281, 274, 245, 257, 248, 
258, 267, 278, 263, 260, 262, 229, 281, 227, 265, 266, 251, 276, 
276, 247, 271, 262, 262, 300, 262, 260, 255, 256, 258, 254, 320
), X11 = c(0, 53, 170, 278, 233, 269, 219, 249, 298, 259, 283, 
303, 182, 255, 243, 282, 282, 232, 282, 221, 282, 280, 279, 297, 
283, 279, 282, 240, 248, 277, 235, 250, 248, 259, 281, 276, 261, 
272, 269, 246, 239, 241, 253, 249, 260, 255, 254, 256, 254, 320
), X12 = c(0, 223, 295, 210, 164, 269, 268, 286, 226, 307, 293, 
211, 195, 240, 264, 243, 249, 232, 206, 252, 241, 242, 250, 269, 
260, 280, 281, 233, 262, 246, 248, 265, 280, 247, 258, 276, 254, 
251, 255, 247, 260, 260, 260, 251, 259, 254, 254, 257, 255, 320
), X14 = c(0, 300, 295, 273, 308, 290, 263, 196, 261, 213, 302, 
243, 281, 298, 273, 241, 300, 291, 281, 261, 228, 196, 279, 278, 
278, 235, 234, 265, 274, 269, 241, 277, 247, 248, 277, 276, 267, 
272, 248, 274, 239, 246, 250, 256, 259, 254, 256, 257, 254, 320
), X15 = c(0, 235, 259, 70, 303, 295, 82, 280, 101, 293, 286, 
278, 291, 302, 276, 281, 281, 288, 260, 287, 252, 295, 260, 258, 
219, 284, 269, 248, 260, 266, 267, 277, 238, 238, 242, 271, 280, 
257, 276, 271, 258, 261, 259, 260, 259, 254, 258, 257, 254, 320
), X16 = c(0, 161, 283, 237, 178, 253, 292, 188, 228, 305, 296, 
244, 210, 214, 262, 193, 283, 278, 287, 268, 235, 221, 293, 270, 
289, 260, 256, 283, 259, 279, 270, 269, 283, 271, 248, 271, 266, 
275, 264, 270, 258, 260, 252, 260, 260, 253, 254, 255, 254, 320
), X17 = c(0, 304, 278, 249, 186, 286, 279, 301, 288, 246, 284, 
188, 254, 283, 300, 262, 242, 276, 255, 294, 282, 253, 262, 274, 
273, 292, 249, 290, 274, 252, 243, 277, 234, 271, 277, 242, 276, 
248, 264, 274, 268, 252, 246, 260, 258, 254, 254, 254, 257, 320
), X18 = c(0, 211, 268, 263, 226, 180, 115, 258, 308, 295, 292, 
243, 258, 264, 249, 231, 298, 278, 276, 275, 269, 227, 277, 267, 
298, 250, 265, 283, 222, 256, 245, 269, 242, 266, 261, 243, 269, 
242, 248, 267, 264, 235, 259, 263, 261, 259, 256, 256, 255, 320
), X19 = c(0, 242, 88, 278, 263, 304, 204, 183, 277, 247, 231, 
282, 195, 242, 242, 222, 256, 203, 264, 280, 263, 262, 299, 260, 
250, 241, 280, 271, 206, 230, 256, 283, 243, 277, 280, 267, 274, 
264, 269, 271, 250, 243, 254, 253, 261, 254, 259, 255, 255, 320
), X20 = c(0, 400, 286, 306, 284, 204, 217, 202, 226, 226, 266, 
288, 239, 246, 301, 287, 277, 263, 284, 280, 299, 288, 270, 279, 
259, 244, 240, 279, 280, 256, 300, 263, 281, 281, 251, 234, 267, 
251, 275, 253, 265, 262, 261, 250, 259, 254, 256, 257, 253, 320
), area = c(0, 84.298625572678, 333.194502290712, 749.687630154103, 
1332.77800916285, 2082.46563931695, 3000.75052061641, 4081.63265306123, 
5331.1120366514, 6747.18867138692, 8329.8625572678, 10079.133694294, 
11995.0020824656, 14077.4677217826, 16326.5306122449, 18742.1907538526, 
21324.4481466056, 24073.302790504, 26988.7546855477, 30070.8038317368, 
33319.4502290712, 36734.693877551, 40316.5347771762, 44064.9729279467, 
47980.0083298626, 52061.6409829238, 56309.8708871304, 60724.6980424823, 
65306.1224489796, 70054.1441066222, 74968.7630154102, 80049.9791753436, 
85297.7925864223, 90712.2032486464, 96293.2111620158, 102040.816326531, 
107955.018742191, 114035.818408996, 120283.215326947, 126600.209496043, 
133277.800916285, 140024.989587672, 146938.775510204, 154019.158683882, 
161266.139108705, 168679.716784673, 176259.891711787, 184006.663890046, 
191920.03331945, 2e 05), mean = c(0, 239.95, 233.95, 202.4, 256.25, 
232.1, 213.2, 227.3, 253.5, 272.9, 260.85, 257.55, 237.2, 253.25, 
250.3, 255.1, 268.2, 258, 262.6, 300.95, 270.35, 252.85, 270.35, 
270.55, 270.4, 262.65, 261.25, 263.75, 256.45, 261.1, 260.1, 
262.6, 250, 262.15, 265.7, 265.6, 267.55, 261.65, 260.9, 260.55, 
258.5, 253.15, 256.65, 257.65, 259.75, 254.5, 255.4, 265.1, 254.4, 
335), slope = c(0.0220147145695401, 0.0220147145695401, 
0.0220147145695401, 0.0220147145695401, 0.0220147145695401, 0.0220147145695401, 
0.0220147145695401, 0.0220147145695401, 0.0220147145695401, 0.0220147145695401, 
0.0220147145695401, 0.0220147145695401, 0.0220147145695401, 0.0220147145695401, 
0.0220147145695401, 0.0220147145695401, 0.0220147145695401, 0.0220147145695401, 
0.0220147145695401, 0.0220147145695401, 0.0220147145695401, 0.0220147145695401, 
0.0220147145695401, 0.0220147145695401, 0.0220147145695401, 0.0220147145695401, 
0.0220147145695401, 0.0220147145695401, 0.0220147145695401, 0.0220147145695401, 
0.0220147145695401, 0.0220147145695401, 0.0220147145695401, 0.0220147145695401, 
0.0220147145695401, 0.0220147145695401, 0.0220147145695401, 0.0220147145695401, 
0.0220147145695401, 0.0220147145695401, 0.0220147145695401, 0.0220147145695401, 
0.0220147145695401, 0.0220147145695401, 0.0220147145695401, 0.0220147145695401, 
0.0220147145695401, 0.0220147145695401, 0.0220147145695401, 0.0220147145695401
)), row.names = c(NA, -50L), class = "data.frame")
> 
  

Как я могу решить эту проблему?
Большое спасибо за вашу помощь!

Комментарии:

1. Проблема в том, что ваша функция фактически не использует в ней аргумент x .

Ответ №1:

Я думаю, вам сначала нужно немного изменить функцию:

 coefLM <- function(x) {
  coef(lm(log(mean 1) ~ log(area 1), data=x))[2]
}
  

У вас есть 0 в mean и area , поэтому добавление к ним начала (или использование другого преобразования) сделает так, чтобы вы не потеряли эти наблюдения. Вам также необходимо, чтобы x данные, которые вы передаете, были данными в модели.

Чтобы произвести расчет, я бы предложил sapply() , который в основном является способом перебора значений. Вы можете перебирать значения 1:nrow(tar.un_sap.10) и каждый раз передавать coefLM() функции данные вплоть до этого номера строки.

 tar.un_sap.10$slope=sapply(1:nrow(tar.un_sap.10), 
                           function(i)coefLM(tar.un_sap.10[1:i, ]))
  

Это приводит к следующему результату:

 tar.un_sap.10$slope
# [1]        NA 1.2368375 1.0122426 0.8672056 0.7885012 0.7211055
# [7] 0.6636478 0.6202517 0.5881208 0.5626241 0.5382451 0.5160296
# [13] 0.4937550 0.4754918 0.4585715 0.4435312 0.4307508 0.4180439
# [19] 0.4065729 0.3964291 0.3868378 0.3766481 0.3681876 0.3601827
# [25] 0.3525755 0.3449165 0.3375712 0.3307222 0.3238242 0.3174924
# [31] 0.3109094 0.3052338 0.2992165 0.2940177 0.2891791 0.2845205
# [37] 0.2801134 0.2756314 0.2712853 0.2670833 0.2629539 0.2587712
# [43] 0.2548675 0.2511334 0.2475967 0.2439944 0.2405411 0.2372216
# [49] 0.2339506 0.2326499
  

Комментарии:

1. Большое спасибо, высоко ценится!